Как оптимально переделать UNICODE-строку в ANSI? Может у кого есть исходник процедуры для данного дела или лучше использовать специальную API-функцию для этого?
Вот так может Код (Text): ; from http://www.asmcommunity.net/board/index.php?topic=21171.0 .386 .model flat, stdcall option casemap:none ; Case sensitive include \Masm32\include\windows.inc include \Masm32\include\kernel32.inc include \Masm32\include\user32.inc includelib \Masm32\lib\user32.lib includelib \Masm32\lib\kernel32.lib Ansi2Unicode proto :DWORD,:DWORD Unicode2Ansi proto :DWORD,:DWORD .data str1 db "mystring",0 ascii db "ascii",0 .data? obuf db 1024 dup(?) obuf2 db 1024 dup(?) .code start: invoke Ansi2Unicode,addr str1,addr obuf invoke MessageBoxW,0,addr obuf,addr obuf,MB_OK invoke Unicode2Ansi,addr obuf,addr obuf2 invoke MessageBox,0,addr obuf2,addr ascii,MB_OK invoke ExitProcess,0 ;---------------------------------------------------------- Ansi2Unicode proc iString,ouptbuf invoke lstrlen,iString invoke MultiByteToWideChar,CP_ACP,0,iString,-1,ouptbuf,eax ret Ansi2Unicode endp ;---------------------------------------------------------- Unicode2Ansi proc iString,ouptbuf invoke lstrlen,ouptbuf invoke WideCharToMultiByte,CP_ACP,0,iString,-1,ouptbuf,eax,0,0 invoke WideCharToMultiByte,CP_ACP,0,iString,-1,ouptbuf,eax,0,0 ret Unicode2Ansi endp ;---------------------------------------------------------- end start
Так как собирался задать вопрос по этой теме, а ответ ТС уже дали довольно полный, позволю себе не создавать новой темы. В общем, ищу класс на C++ для работы с UTF-8 строками. Не любой, а именно тот, который скомпилен в дизассемблируемый бинарь. Может кому попадалось (есть подозрения что он Open Source). Вот некоторые "особенности": - Класс не использует исключений, либо они отключены дефайном. - Нет завязки на WinAPI, преобразование строк ведётся ручками. - Класс имеет 3 члена-данных, в следующем порядке: wchar_t *dbcs_string, char *utf8_string, size_t length. - Определены операторы operator<, operator=, operator!=. Возможно и другие, но этих хватает для помещения строк в контейнер std::set.
Код (Text): ntdll.dll: NTSTATUS WINAPI RtlUnicodeStringToAnsiString(PANSI_STRING,PCUNICODE_STRING,BOOLEAN); NTSTATUS WINAPI RtlUnicodeStringToInteger(const UNICODE_STRING *,ULONG,ULONG *); NTSTATUS WINAPI RtlUnicodeStringToOemSize(const UNICODE_STRING*); NTSTATUS WINAPI RtlUnicodeStringToOemString(POEM_STRING,PCUNICODE_STRING,BOOLEAN); NTSTATUS WINAPI RtlUnicodeToMultiByteN(LPSTR,DWORD,LPDWORD,LPCWSTR,DWORD); NTSTATUS WINAPI RtlUnicodeToMultiByteSize(PULONG,PCWSTR,ULONG); NTSTATUS WINAPI RtlUnicodeToOemN(LPSTR,DWORD,LPDWORD,LPCWSTR,DWORD); зачем велосипеды?
integer, Т.е. кодовые страницы и прочие суррогатные пары UTF-16 — побоку? Решение, конечно, неплохое (для ASCII). Зачем ехать на велосипеде, который довезёт только ноги?