Чтение текстового файла с преобразованием в UTF-16
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.10.17 04:06
Оценка:
Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?

Или все, кто не использует средства Runtime, самостоятельно городят свой анализ-преобразование?
unicode utf-16 utf-8 файл чтение
Re: Чтение текстового файла с преобразованием в UTF-16
От: Aniskin  
Дата: 10.10.17 04:44
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?


Можно попробовать использовать пару IMultiLanguage2::DetectInputCodepage/IMultiLanguage2::ConvertStringToUnicode. Сам я с ними не работал.
Re: Чтение текстового файла с преобразованием в UTF-16
От: Alexander G Украина  
Дата: 10.10.17 09:10
Оценка: +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?


По шагам вижу решение так, не само, но минимум действий:
Русский военный корабль идёт ко дну!
Re[2]: Чтение текстового файла с преобразованием в UTF-16
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.10.17 16:14
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Можно попробовать использовать пару IMultiLanguage2::DetectInputCodepage/IMultiLanguage2::ConvertStringToUnicode.


Спасибо, получилось. В Vista+ работает нормально, а вот XP SP1 не убирает BOM из начала файла.

P.S. Перепутал — это оно добавляет BOM для UTF-16LE, причем во всех реализациях. А под Vista+ он просто не виден на экране при выводе через MessageBox, поэтому сгоряча подумал, будто добавляется только в XP.
Отредактировано 11.10.2017 16:35 Евгений Музыченко . Предыдущая версия .
Re[2]: Чтение текстового файла с преобразованием в UTF-16
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.10.17 16:16
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>По шагам вижу решение так, не само, но минимум действий:


Это понятно, просто думалось, что за столько лет поддержки Unicode в API сделали что-нибудь автоматическое.

Пока сделал через IMultilanguage2, но под XP оно не убирает BOM, если он есть. Так что, скорее всего, надежнее будет таки действительно сделать через MultiByteToWideChar.
Re[3]: Чтение текстового файла с преобразованием в UTF-16
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 12.10.17 16:36
Оценка:
ЕМ>P.S. Перепутал — это оно добавляет BOM для UTF-16LE, причем во всех реализациях. А под Vista+ он просто не виден на экране при выводе через MessageBox, поэтому сгоряча подумал, будто добавляется только в XP.

Вдобавок выяснилось, что при наличии BOM для UTF-8, но отсутствии многобайтовых символов, первой возвращает описатель с nDocPercent=100, высоким nConfidence, и страницей 1252, и только второй описатель — со страницей 65001 и nDocPercent=nConfidence=-1. Так что пришлось добавлять ручную проверку/обход BOM с выставлением нужной CP для ConvertStringToUnicode.

Почему ж у них все так через задницу-то...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.