Уважаемые, есть вопрос!
MultiByteToWideChar — как работает эта функция?
И как написать свою ?
Это нужно для PocketPC.
На десктопе под WindowsXP происходит следующее:
char* AnsiName = "Film Игла";
int size = strlen(AnsiName)+1;
WCHAR* UnicodeName = new WCHAR[size];
MultiByteToWideChar(CP_ACP,0, AnsiName,size,UnicodeName,size);
__int64 a_HashSumXP = ::GetHashSum(UnicodeName,size);
А затем делаем тоже самое на PocketPC:
......
__int64 a_HashSumCE = ::GetHashSum(UnicodeName,size);
И вот получается что эти a_HashSumXX не равны!!
Может это потому, что в строке есть буквы и из латиницы и из кириллицы?
12.09.03 18:32: Перенесено модератором из 'WIN API' — AS
Меньше читай, больше думай. (А.Сурожский)
Меньше читай, больше думай. (А.Сурожский)
Здравствуйте, Karabinos, Вы писали:
K>И вот получается что эти a_HashSumXX не равны!!
Проверьте, возвращает ли ::GetACP() равные значения там и там.
Если не уверены, то пишите:
::MultiByteToWideChar(
1251, // (*)
0,
AnsiName,size,
UnicodeName,size);
(*) Обязательное условие соответствия результатов на всех девайсах... кроме тех, у которых нет этой страницы и эта функция вернет 0, см. ниже.
K>Может это потому, что в строке есть буквы и из латиницы и из кириллицы?
Нет.
K>MultiByteToWideChar — как работает эта функция?
Эта функция работает по таблице, находящейся в NLS структуре для заданной кодовой страницы.
Следует помнить, что многие девайсы без руссификаторов не имеют NLS для кирилицы вообще (хотя шрифты есть и все отображается без проблем).
И даже те, что с руссификаторами могут иметь в ::GetACP() КОИ'вую установку — почту читать
K>И как написать свою ?
Не понял вопроса. Все сводится к
static const WCHAR _ansi1251toUnicodeMap[256] =
{
... // (**)
};
(**) Генериться за 5 минут на большом.
BYTE cAnsi1251[256];
WCHAR wcUnicode[256];
int i;
for (i =0; i < 256; i++)
cAnsi1251[i] = i;
::MultiByteToWideChar(
1251,
0,
&cAnsi1251[0],
256,
&wcUnicode[0],
256);
Далее дело техники.
P. S.
На моем хомяке проект по руссификация BE-300 (WinCE 3.0), так вот там я полностью переписывал именно ::MultiByteToWideChar() (прямо системную, прямо в пямяти). Исходники свободны (хотя и не опубликованы), но из за особой специфики они на MIPS asm.