Конвертация UNICODE в ANSI

Тема в разделе "WASM.BEGINNERS", создана пользователем solvitz, 22 дек 2010.

  1. solvitz

    solvitz Member

    Публикаций:
    0
    Регистрация:
    28 авг 2010
    Сообщения:
    86
    Как оптимально переделать UNICODE-строку в ANSI? Может у кого есть исходник процедуры для данного дела или лучше использовать специальную API-функцию для этого?
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    solvitz
    WideCharToMultiByte/MultibyteToWideChar??? (как-то так)
    А, что мсдн уже на катит?
     
  3. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    SHAnsiToUnicode
    SHUnicodeToAnsi
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Вот так может
    Код (Text):
    1. ; from http://www.asmcommunity.net/board/index.php?topic=21171.0
    2. .386
    3. .model flat, stdcall
    4. option casemap:none   ; Case sensitive
    5.  
    6. include  \Masm32\include\windows.inc
    7. include  \Masm32\include\kernel32.inc
    8. include  \Masm32\include\user32.inc
    9. includelib  \Masm32\lib\user32.lib
    10. includelib  \Masm32\lib\kernel32.lib
    11.          
    12. Ansi2Unicode proto :DWORD,:DWORD
    13. Unicode2Ansi proto :DWORD,:DWORD
    14.          
    15. .data
    16.  str1       db "mystring",0
    17.  ascii      db "ascii",0
    18. .data?
    19.  obuf       db 1024 dup(?)
    20.  obuf2      db 1024 dup(?)
    21.  
    22. .code
    23. start:
    24. invoke Ansi2Unicode,addr str1,addr obuf
    25. invoke MessageBoxW,0,addr obuf,addr obuf,MB_OK
    26. invoke Unicode2Ansi,addr obuf,addr obuf2
    27. invoke MessageBox,0,addr obuf2,addr ascii,MB_OK
    28. invoke ExitProcess,0
    29.  
    30. ;----------------------------------------------------------
    31. Ansi2Unicode proc iString,ouptbuf
    32. invoke lstrlen,iString
    33. invoke MultiByteToWideChar,CP_ACP,0,iString,-1,ouptbuf,eax
    34. ret
    35. Ansi2Unicode endp
    36.  
    37. ;----------------------------------------------------------
    38. Unicode2Ansi proc iString,ouptbuf
    39. invoke lstrlen,ouptbuf
    40. invoke WideCharToMultiByte,CP_ACP,0,iString,-1,ouptbuf,eax,0,0
    41. invoke WideCharToMultiByte,CP_ACP,0,iString,-1,ouptbuf,eax,0,0
    42. ret
    43. Unicode2Ansi endp
    44. ;----------------------------------------------------------
    45. end start
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Так как собирался задать вопрос по этой теме, а ответ ТС уже дали довольно полный, позволю себе не создавать новой темы.
    В общем, ищу класс на C++ для работы с UTF-8 строками. Не любой, а именно тот, который скомпилен в дизассемблируемый бинарь. Может кому попадалось (есть подозрения что он Open Source). Вот некоторые "особенности":
    - Класс не использует исключений, либо они отключены дефайном.
    - Нет завязки на WinAPI, преобразование строк ведётся ручками.
    - Класс имеет 3 члена-данных, в следующем порядке: wchar_t *dbcs_string, char *utf8_string, size_t length.
    - Определены операторы operator<, operator=, operator!=. Возможно и другие, но этих хватает для помещения строк в контейнер std::set.
     
  6. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Код (Text):
    1. ntdll.dll:
    2. NTSTATUS  WINAPI RtlUnicodeStringToAnsiString(PANSI_STRING,PCUNICODE_STRING,BOOLEAN);
    3. NTSTATUS  WINAPI RtlUnicodeStringToInteger(const UNICODE_STRING *,ULONG,ULONG *);
    4. NTSTATUS    WINAPI RtlUnicodeStringToOemSize(const UNICODE_STRING*);
    5. NTSTATUS  WINAPI RtlUnicodeStringToOemString(POEM_STRING,PCUNICODE_STRING,BOOLEAN);
    6. NTSTATUS  WINAPI RtlUnicodeToMultiByteN(LPSTR,DWORD,LPDWORD,LPCWSTR,DWORD);
    7. NTSTATUS  WINAPI RtlUnicodeToMultiByteSize(PULONG,PCWSTR,ULONG);
    8. NTSTATUS  WINAPI RtlUnicodeToOemN(LPSTR,DWORD,LPDWORD,LPCWSTR,DWORD);
    зачем велосипеды?
     
  7. integer

    integer New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2007
    Сообщения:
    62
    lodsw
    stosb

    зачем ехать на велосипеде если есть телепорт ?
     
  8. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    integer,

    Т.е. кодовые страницы и прочие суррогатные пары UTF-16 — побоку? Решение, конечно, неплохое (для ASCII).

    Зачем ехать на велосипеде, который довезёт только ноги? :derisive: