Форум: "Основная";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
ВнизПара вопросов про Unicode Найти похожие ветки
← →
Fr0sT (2009-10-20 15:52) [0]Копаясь в коде и переделывая его под Unicode (а точнее, и для Unicode, и для Ansi), столкнулся с двумя вопросами в использовании функций MultiByteToWideChar:
1) Как определить, сколько байт (символов исходной строки) успешно сконвертировано в WideChar, если функция возвращает только количество результирующих WideChar
Для чего это нужно: я конвертирую информацию из буфера, который может произвольным образом разделить строки. То есть нередка ситуация, когда в одну итерацию в конце буфера остаётся кусок unicode символа, остальная часть которого получается только в следующей итерации. Чтобы не терять этот символ, нужно знать, сколько байт реально было сконвертировано, и перенести остаток в начало буфера перед следующим чтением в него. Пока что для этого я используюCharCnt := WideCharToMultiByte(CP, 0, pDestW, WCharCnt, nil, 0, nil, nil);
то есть сразу же конвертирую полученную Wide строку обратно, тем самым получая искомое количество исходных символов. Возможно, есть другой, более правильный и быстрый способ?
2) Как обращаться с кодировками utf16*
MultiByteToWideChar возвращает ошибку, если кодовая страница равна одной из этих кодировок. В хелпе везде указано, что они «available only to managed applications». Что это значит? Я гуглил, но ничего внятного не нашёл. Порылся в SysUtils.TEncoding, они там вручную копируют байты один в один для little-endian и с перестановкой порядка для big-endian. Но неужели обращение с этими кодировками не предусмотрено в MultiByteToWideChar?
P.S. Варианты типа «заюзай TEncoding и не парь мозги» не подходят — хочу обратной совместимости с D < 2009.
← →
palva © (2009-10-20 20:01) [1]Наверно, лучше определить границу последнего символа и давать на преобразование строку без неполных символов. Первый байт символа UTF8 имеет единицу в двух старших битах (когда символ состоит из нескольких байтов), либо нуль в старшем бите (состоит из одного байта).
А ваш метод будет вносить дополнительные ошибки в случае, если в середине строки встретился ошибочный символ. Насколько я понимаю, он просто исчезнет из результирующей строки, и по вашему алгоритму вы будете дублировать последний символ, либо выходить на середину символа.
В документации на API описан флаг, который нужно установить, чтобы функция сигнализировала об ошибке, если в строке были плохие символы. Было бы корректнее установить этот флаг и проверять код ошибки.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.002 c