kenny5705 MultiByteToWideChar в этом направлении копай
Добавлено: может пригодится код на масме
(ANSIOEM) to UTF8
[more]
.386
.model flat, stdcall
option casemap :none
;************************************************************
; 20060810 U.Neudecker
;************************************************************
include \masm32\include\masm32.inc
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\macros\macros.asm
; CharTypes:
; CP_ACP ANSI codepage = 0
; CP_OEMCP OEM (original equipment manufacturer) codepage = 1
CP_UTF8 equ 65001
.code
COMMENT * #######################################################################
Converts a String (ANSI/OEM) to UTF8
The buffer pointed to by pUTF8String must be sufficient to hold the UTF8-string.
Otherwise GetLastError is called.
If the function succeeds, the return value is the number of bytes written to the buffer
pointed to by pUTF8String. The number includes the byte for the null terminator
Otherwise GetLastError is called with neg(!) result.
####################################################################### COMMENT *
CharToUTF8 proc stdcall uses ecx,
pCharString:dword,
lenCharString:dword,
CharType:dword,
pUTF8String:dword,
lenUTF8String:dword
LOCAL pUNICODE:dword
LOCAL lenUNICODE:DWORD
mov ecx, lenCharString
shl ecx, 1
invoke ealloc, ecx
mov pUNICODE, eax
invoke MultiByteToWideChar, CharType, 1, pCharString, lenCharString, pUNICODE, ecx
.if eax == 0
invoke GetLastError
neg eax
invoke efree, pUNICODE
ret
.endif
invoke WideCharToMultiByte, CP_UTF8, 0, pUNICODE, lenCharString, pUTF8String, lenUTF8String, 0, 0
.if eax == 0
invoke GetLastError
neg eax
.endif
push eax
invoke efree, pUNICODE
pop eax
ret
CharToUTF8 endp
;#######################################################################
UTF8ToChar proc stdcall uses ecx,
pUTF8String:dword,
lenUTF8String:dword,
pCharString:dword,
lenCharString:dword,
CharType:dword
LOCAL pUNICODE:dword
LOCAL lenUNICODE:DWORD
invoke MultiByteToWideChar, CP_UTF8, 0, pUTF8String, lenUTF8String, pUNICODE, 0
mov lenUNICODE, eax
shl eax, 1
invoke ealloc, eax
mov pUNICODE, eax
invoke MultiByteToWideChar, CP_UTF8, 0, pUTF8String, lenUTF8String, pUNICODE, lenUNICODE
invoke WideCharToMultiByte, CharType, 0, pUNICODE, lenUNICODE, pCharString, lenCharString, 0, 0
.if eax == 0
invoke GetLastError
neg eax
.endif
push eax
invoke efree, pUNICODE
pop eax
ret
UTF8ToChar endp
;#######################################################################
END
[/more]
UTFTOANSI
[more]
; ===============================================================
; ===============================================================
.386 ; процессор
.model flat,stdcall ; память плоская, stdcall определяет порядок передачи параметров слева-направо, а также что будет балансировать стек после вызова функции
option casemap:none ; в этой программе важны регистры букв
; ===============================================================
include \masm32\include\windows.inc ; библиотеки используемые программой
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \MASM32\include\wininet.inc
include \MASM32\INCLUDE\shlwapi.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \MASM32\lib\wininet.lib ; точка с запятой отделяют ремарки от основного кода программы
includelib \MASM32\LIB\shlwapi.lib
; ===============================================================
.data ; секция данных
String db 'Текстовый документ Текстовый документ Текстовый документ.txt',0
;String db '[RuTor.Org]Карьера_охранника_Де.torrent',0
;String db '',0
;String db '[RuTor.Org]Insadong_Scandal.torrent[RuTor.Org]Insadong_Scandal.torrent',0
;String db 'Текстовый документ Текстовый документ Текстовый документ.txt',0
;String db 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЭэЮюЯяЫыЪъЬь',0
;String db 'АаБбРРІР“РіР”РґР•РµРЃС‘Р–Р¶Р—Р·Р˜РёР™Р№РљРєР›Р»РњРјРќРЅРћРѕРџРїР СЂРЎСЃРўС‚РЈСѓР¤С„РҐС…Р¦С†Р§С‡РЁС€Р©С‰Р-эЮюЯяЫыЪъ',0
; ===============================================================
.data? ; секция с неинициализированными данными, они не включается в исполняемый файл и появляется только тогда, когда программа загружается в память
PointToString dd ?
COnvertBuffer db INTERNET_MAX_URL_LENGTH dup (?)
db INTERNET_MAX_URL_LENGTH dup (?)
COnvertBufSize dd ?
COnvertStrSize dd ?
; ===============================================================
.code ; начало кода
start: ; старт
mov PointToString, offset String
invoke lstrlen,PointToString
mov COnvertStrSize, eax
invoke MultiByteToWideChar, CP_UTF8, 0, PointToString, COnvertStrSize, COnvertBufSize, 0
mov COnvertBufSize, eax
invoke MultiByteToWideChar, CP_UTF8, 0, PointToString, COnvertStrSize, addr COnvertBuffer, COnvertBufSize
invoke WideCharToMultiByte,CP_ACP,0,addr COnvertBuffer,COnvertBufSize,PointToString,COnvertStrSize,0,0
mov eax, COnvertBufSize
lea ebx,String
add eax, ebx
mov byte ptr [eax], 0
invoke MessageBox,0,addr String,0,0
invoke ExitProcess,0 ; выходим из программы, eax - код возврата
end start ; конец ассемблирования
[/more]
Добавлено: http://wiki.shelek.ru/index.php/FAQ:WinAPI_VCPP:%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_windows-1251_%D0%B8_UTF-8 вот чета про Си есть