Здравствуйте, RussianFellow, Вы писали:
RF>В чём заключается отличие функций MultiByteToWideChar/WideCharToMultiByte и AnsiToOem/OemToAnsi ?
Первая пара это функции WinAPI переводящие строки из различных однобайтовых кодировок ANSI (OEM — CP437 в том числе) в различные Unicode кодировки и обратно. Названия "дебильные" и ни о чем не говорят.
Вторая пара это не понятно от куда. Могу предположить что переводит из OEM кодировки в заданную ANSI и обратно. Естественно с потерями, т.к. взаимнооднозначного соответствия нет (в OEM только латинские символы и псевдографика).
Re[2]: В чём отличие функций MultiByteToWideChar и AnsiToOem ?
Здравствуйте, Videoman, Вы писали:
RF>>В чём заключается отличие функций MultiByteToWideChar/WideCharToMultiByte и AnsiToOem/OemToAnsi ? V>Первая пара это функции WinAPI переводящие строки из различных однобайтовых кодировок ANSI (OEM — CP437 в том числе) в различные Unicode кодировки и обратно.
Функция MultiByteToWideChar переводит не только однобайтовые, но и многобайтовые (мультибайтные?) представления строк. Мультибайтные — это такие, где один символ кодируется одним или большим числом байт. Т.е. в одной строке часть символов кодируется одним байтом, часть — двумя и т.д.. Например UTF-8 — это мультибайтовая кодировка, хотя и Unicode. Насколько я помню, MultiByteToWideChar поддерживает в том числе мультибайтовые не Unicode кодировки (те кодировки, которые использовались до Unicode'а).
И каждый день — без права на ошибку...
Re[3]: В чём отличие функций MultiByteToWideChar и AnsiToOem
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, Videoman, Вы писали:
BFE>Функция MultiByteToWideChar переводит не только однобайтовые, но и многобайтовые (мультибайтные?) представления строк. Мультибайтные — это такие, где один символ кодируется одним или большим числом байт. Т.е. в одной строке часть символов кодируется одним байтом, часть — двумя и т.д.. Например UTF-8 — это мультибайтовая кодировка, хотя и Unicode.
Да. Так и есть. Тогда точнее так: функции переводят из/в ANSI/UNICODE различные кодировки переменной длины в кодировки фиксированной длины. Интересно что они понимают под WideChar ? UCS2 ? Но вроде как Windows уже давно поддерживает полноценный UTF-16. Все-таки логика названия функций от меня ускользает.
P.S. А ну в MSDN так и написано: начиная с Windows Vista все переводится в "настоящий" UTF-16 c суррогатными парами. Т.е. Функции переводят из различных кодировок переменной длины в UTF-16 переменной длины. Н-да-а-а
V>Первая пара это функции WinAPI переводящие строки из различных однобайтовых кодировок ANSI (OEM — CP437 в том числе) в различные Unicode кодировки и обратно. Названия "дебильные" и ни о чем не говорят. V>Вторая пара это не понятно от куда. Могу предположить что переводит из OEM кодировки в заданную ANSI и обратно. Естественно с потерями, т.к. взаимнооднозначного соответствия нет (в OEM только латинские символы и псевдографика).
Под OEM в винде подразумевается консольная кодировка, используемая в ДОС сессии. Например CP866 — вполне себе русская. Но не соответствует CP1251
Как много веселых ребят, и все делают велосипед...
Re: В чём отличие функций MultiByteToWideChar и AnsiToOem ?
RF>В чём заключается отличие функций MultiByteToWideChar/WideCharToMultiByte и AnsiToOem/OemToAnsi ?
AnsiToOem(src, dst) == {MultiByteToWideChar(CP_ACP, src, tmp); WideCharToMultiByte(CP_OEMCP, tmp, dst)}
Где CP_ACP/CP_OEMCP текущие кодировки, определенные настройками системы.
В правильно настроенной русской винде CP_ACP == CP_1251, а CP_OEMCP == CP866
Как много веселых ребят, и все делают велосипед...