Конвертация encoding'а
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 26.02.19 23:09
Оценка:
Здрвствуйте!

Вопрос по WideCharToMultibyte и MultibyteToWideChar.

Мне нужно получить строку wchar_t*. На входе имею варианты из: UTF16_BOM, UTF16BE, UTF16BE_BOM, UTF8_BOM. Что куда совать?
Маньяк Робокряк колесит по городу
Отредактировано 26.02.2019 23:40 Marty . Предыдущая версия .
Re: Конвертация encoding'а
От: BlackEric http://black-eric.lj.ru
Дата: 27.02.19 15:40
Оценка: 4 (1)
Здравствуйте, Marty, Вы писали:

M>Здрвствуйте!


M>Вопрос по WideCharToMultibyte и MultibyteToWideChar.


M>Мне нужно получить строку wchar_t*. На входе имею варианты из: UTF16_BOM, UTF16BE, UTF16BE_BOM, UTF8_BOM. Что куда совать?


Преобразования Unicode-кодировок с помощью STL-строк и Win32 API

Я бы начал отсюда. Тема пакостная. Обязательно нужно иметь набор тестов который будет все это покрывать.

Еще может помочь использование std::codecvt_utf16
https://github.com/BlackEric001
Re[2]: Конвертация encoding'а
От: Mr.Delphist  
Дата: 28.02.19 14:31
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Преобразования Unicode-кодировок с помощью STL-строк и Win32 API

BE>Я бы начал отсюда. Тема пакостная. Обязательно нужно иметь набор тестов который будет все это покрывать.

Плюс тут ещё есть зависимость поведения этого API от версии винды. Что-то (типа многобайтовых эмодижков с гендером, цветом кожи и т.п.) не будет работать корректно на WinXP, однако на Win10 будет ОК.
Re: Конвертация encoding'а
От: qaz77  
Дата: 01.03.19 11:03
Оценка: 4 (1)
Здравствуйте, 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, ...).
Re[2]: Конвертация encoding'а
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 01.03.19 15:40
Оценка:
Здравствуйте, qaz77, Вы писали:


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 его поймет или тоже руками надо будет конвертить?
Маньяк Робокряк колесит по городу
Re[3]: Конвертация encoding'а
От: qaz77  
Дата: 04.03.19 07:18
Оценка:
Здравствуйте, 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" в этом случае нет.
Re[4]: Конвертация encoding'а
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 04.03.19 16:42
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>UTF-32 эти функции не поддерживают.

Q>Но, как мне представляется, это самый простой случай, когда ЛЮБЫЕ символы юникода представлены равными кусками по 32 бита.
Q>Никакой логики "multibyte" в этом случае нет.

Да, но хочется иметь на выходе UTF-16, чтобы в винду присовывать без проблем
Маньяк Робокряк колесит по городу
Re[5]: Конвертация encoding'а
От: qaz77  
Дата: 05.03.19 08:12
Оценка:
Здравствуйте, Marty, Вы писали:
M>Да, но хочется иметь на выходе UTF-16, чтобы в винду присовывать без проблем

Номера кодовых страниц для UTF-32 и UTF-32BE — 12000 и 12001 соответственно.
Можно попробовать их передавать в MultiByteToWideChar...

Хотя в MSDN для этих кодовых станиц есть такое замечание:

available only to managed applications

docs.microsoft.com/ru-ru/windows/desktop/Intl/code-page-identifiers
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.