Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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. Варианты типа &laquo;заюзай TEncoding и не парь мозги&raquo; не подходят &#151; хочу обратной совместимости с D < 2009.


 
palva ©   (2009-10-20 20:01) [1]

Наверно, лучше определить границу последнего символа и давать на преобразование строку без неполных символов. Первый байт символа UTF8 имеет единицу в двух старших битах (когда символ состоит из нескольких байтов), либо нуль в старшем бите (состоит из одного байта).

А ваш метод будет вносить дополнительные ошибки в случае, если в середине строки встретился ошибочный символ. Насколько я понимаю, он просто исчезнет из результирующей строки, и по вашему алгоритму вы будете дублировать последний символ, либо выходить на середину символа.

В документации на API описан флаг, который нужно установить, чтобы функция сигнализировала об ошибке, если в строке были плохие символы. Было бы корректнее установить этот флаг и проверять код ошибки.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.002 c
10-1156496750
фыва
2006-08-25 13:05
2011.06.05
OleContainer и ScrollBar


15-1296771492
xayam
2011-02-04 01:18
2011.06.05
Какая у Вас группа крови?


2-1298537474
FIL-23
2011-02-24 11:51
2011.06.05
растягиване компонент пропорционально форме


1-1255806622
minomorf
2009-10-17 23:10
2011.06.05
Как в TSynEdit сделать подсветку строки (как при ошибке)


2-1298464739
Артём
2011-02-23 15:38
2011.06.05
Ограничить поле вывода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский