Здравствуйте, Marty, Вы писали:
M>Здрвствуйте!
M>Вопрос по WideCharToMultibyte и MultibyteToWideChar.
M>Мне нужно получить строку wchar_t*. На входе имею варианты из: UTF16_BOM, UTF16BE, UTF16BE_BOM, UTF8_BOM. Что куда совать?
Плюс тут ещё есть зависимость поведения этого API от версии винды. Что-то (типа многобайтовых эмодижков с гендером, цветом кожи и т.п.) не будет работать корректно на WinXP, однако на Win10 будет ОК.
Здравствуйте, Marty, Вы писали: M>Вопрос по WideCharToMultibyte и MultibyteToWideChar.
M>Мне нужно получить строку wchar_t*. На входе имею варианты из: UTF16_BOM, UTF16BE, UTF16BE_BOM, UTF8_BOM. Что куда совать?
Сами эти функции анализировать/пропускать BOM не умеют.
Из перечисленного могут понадобиться только для случая CP_UTF8 <-> wchar_t* с ограничениями от версии Windows, как уже написали.
Сам BOM как раз нужен для распознания формата последующих данных.
UTF16BE без BOM автоматически распознать не получиться (или эвристиками только).
UTF16_BOM (т.е. LE, я полагаю) — просто пропускаем BOM и копируем данные в wchar_t*.
Для UTF16BE надо байтики местами поменять для каждого wchar_t.
И только для случая, когда нашли трех байтный UTF-8 BOM, пропускать его и вызывать MultibyteToWideChar(СP_UTF8, ...).
Q>Сам BOM как раз нужен для распознания формата последующих данных. Q>UTF16BE без BOM автоматически распознать не получиться (или эвристиками только).
Функция IsUnicodeText или как-то так — вроде справляется.
Q>UTF16_BOM (т.е. LE, я полагаю) — просто пропускаем BOM и копируем данные в wchar_t*. Q>Для UTF16BE надо байтики местами поменять для каждого wchar_t.
Q>И только для случая, когда нашли трех байтный UTF-8 BOM, пропускать его и вызывать MultibyteToWideChar(СP_UTF8, ...).
Так и сделал в итоге. Еще не разобрался с UTF-32, но он пока не особо нужен. Интересно, MultibyteToWideChar его поймет или тоже руками надо будет конвертить?
Здравствуйте, Marty, Вы писали: M>Функция IsUnicodeText или как-то так — вроде справляется.
Она смотрит на BOM и считает статистики всякие, в зависимостси от флагов:
The IS_TEXT_UNICODE_STATISTICS and IS_TEXT_UNICODE_REVERSE_STATISTICS tests use statistical analysis. These tests are not foolproof.
M>Еще не разобрался с UTF-32, но он пока не особо нужен. Интересно, MultibyteToWideChar его поймет или тоже руками надо будет конвертить?
UTF-32 эти функции не поддерживают.
Но, как мне представляется, это самый простой случай, когда ЛЮБЫЕ символы юникода представлены равными кусками по 32 бита.
Никакой логики "multibyte" в этом случае нет.
Здравствуйте, qaz77, Вы писали:
Q>UTF-32 эти функции не поддерживают. Q>Но, как мне представляется, это самый простой случай, когда ЛЮБЫЕ символы юникода представлены равными кусками по 32 бита. Q>Никакой логики "multibyte" в этом случае нет.
Да, но хочется иметь на выходе UTF-16, чтобы в винду присовывать без проблем