Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?
Или все, кто не использует средства Runtime, самостоятельно городят свой анализ-преобразование?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?
Можно попробовать использовать пару IMultiLanguage2::DetectInputCodepage/IMultiLanguage2::ConvertStringToUnicode. Сам я с ними не работал.
Re: Чтение текстового файла с преобразованием в UTF-16
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть ли в WinAPI средства автоматического преобразования данных, читаемых из текстового файла, в UTF-16? Чтобы само понимало наличие BOM, при его отсутствии анализировало структуру на предмет UTF-7/8, и на выходе выдавало текст в UTF-16, независимо от его исходного вида?
По шагам вижу решение так, не само, но минимум действий:
IsTextUnicode делает анализ, опционально с учётом BOM, опционально с учётом других эвристик (типа статистики и нулей в тексте), опционально с учётом возможности UTF-16BE вместо UTF-16LE
MultiByteToWideChar может сконвертить CP_UTF7 или CP_UTF8
Если UTF-16BE, то вручную свопнуть каждую пару байт
Русский военный корабль идёт ко дну!
Re[2]: Чтение текстового файла с преобразованием в UTF-16
Здравствуйте, Aniskin, Вы писали:
A>Можно попробовать использовать пару IMultiLanguage2::DetectInputCodepage/IMultiLanguage2::ConvertStringToUnicode.
Спасибо, получилось. В Vista+ работает нормально, а вот XP SP1 не убирает BOM из начала файла.
P.S. Перепутал — это оно добавляет BOM для UTF-16LE, причем во всех реализациях. А под Vista+ он просто не виден на экране при выводе через MessageBox, поэтому сгоряча подумал, будто добавляется только в XP.
Здравствуйте, Alexander G, Вы писали:
AG>По шагам вижу решение так, не само, но минимум действий:
Это понятно, просто думалось, что за столько лет поддержки Unicode в API сделали что-нибудь автоматическое.
Пока сделал через IMultilanguage2, но под XP оно не убирает BOM, если он есть. Так что, скорее всего, надежнее будет таки действительно сделать через MultiByteToWideChar.
Re[3]: Чтение текстового файла с преобразованием в UTF-16
ЕМ>P.S. Перепутал — это оно добавляет BOM для UTF-16LE, причем во всех реализациях. А под Vista+ он просто не виден на экране при выводе через MessageBox, поэтому сгоряча подумал, будто добавляется только в XP.
Вдобавок выяснилось, что при наличии BOM для UTF-8, но отсутствии многобайтовых символов, первой возвращает описатель с nDocPercent=100, высоким nConfidence, и страницей 1252, и только второй описатель — со страницей 65001 и nDocPercent=nConfidence=-1. Так что пришлось добавлять ручную проверку/обход BOM с выставлением нужной CP для ConvertStringToUnicode.