Как обнаружить неполный многобайтовый символ в WinAPI? - PullRequest
1 голос
/ 06 августа 2011

Я использую MultiByteToWideChar для преобразования потока в кодировке UTF-8 в широкие символы.Когда есть неполный символ и конец буфера преобразования, эта функция заменяет его на '?'знак.Какие проверки / настройки я должен выполнить, чтобы обнаружить неполные символы для их добавления перед следующим буфером?

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Если вы посмотрите на запись Википедии в UTF8 , есть удобная таблица, которая показывает возможные типы многобайтовых конфигураций. Ключевым моментом UTF8 является то, что все начальные байты следуют одному набору битовых комбинаций, а все последующие байты следуют другому набору битов. Примечательно, что все последующие байты имеют битовую комбинацию 10xxxxxx.

Кажется, вы можете найти подходящую точку останова, отсканировав назад от конца строки, пока не найдете байт, который не соответствует 10xxxxxx; если этот байт равен 0xxxxxxx, тогда завершите строку после этого байта (поскольку это однобайтовая последовательность), в противном случае завершите строку в / перед ней (так как это начало многобайтовой последовательности), и добавьте байт (s). ) после него до начала следующей строки.

0 голосов
/ 06 августа 2011

как они это делают в Python К сожалению, это кажется неправильным, поскольку они обнаруживают только старший байт в одной позиции, в то время как он может быть частью символа длиной три или четыре байта и, следовательно, его труднее найти: (

Более того, этот метод работает только для нескольких выбранных кодировок, сообщает документацию по IsDBCSLeadByteEx . И эта статья объясняет, почему , но не облегчает жизнь.

...