
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ataru, вот еще вариант на винапи
![]() ![]() void utf16to8( const std::wstring& utf16, std::string& utf8 ) { char mUtf8[ MAX_PATH ] = { 0 }; int len = WideCharToMultiByte(CP_UTF8, 0, utf16.c_str(), -1, NULL, 0, 0, 0); if (len >= 1 && len < MAX_PATH ) { WideCharToMultiByte(CP_UTF8, 0, utf16.c_str(), -1, mUtf8, len, 0, 0); } utf8 = mUtf8; } void utf8to16(const std::string& utf8, std::wstring& utf16) { wchar_t mUtf16[ MAX_PATH ] = { 0 }; int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0); if ( len >= 1 && len < MAX_PATH ) { MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, mUtf16, len ); } utf16 = mUtf16; } |
Сообщ.
#17
,
|
|
|
Этот способ тоже добавляет в начало символы и тоже только при первом преобразовании. Из "text" делает "text"
И почему названия функций и переменных такие странные? utf8 это и есть юникод. Корректнее было бы назвать Utf8ToASCII(), мне во всяком случае нужно именно такое преобразование Добавлено Все, сорри, вопрос снимается. Этот первый символ оказывается раньше появляется, т.е. проблема в другом месте. Просто в отладчике его не видно, если смотреть значение wstring, но он есть в буфере, из которого эта wstring создается. |
Сообщ.
#18
,
|
|
|
Добавляемые символы - это BOM (Byte Order Mark). Показывают порядок байт в широких символах. Добавляются скорее всего текстовым редактором (виндовый Notepad так делает), хотя в файле с кодировкой UTF-8 их ставить не обязательно. По стандарту их наоборот не должно быть.
WideChar и MultyByte это исторические названия, пришли из времён, когда названий UNICODE и UTF-8 ещё не придумали. |
Сообщ.
#19
,
|
|
|
Цитата Ataru @ И почему названия функций и переменных такие странные? utf8 это и есть юникод. Корректнее было бы назвать Utf8ToASCII(), мне во всяком случае нужно именно такое преобразование конвертация зависит от флагов у APIшной функции MultiByteToWideChar, в моем случае это CP_UTF8 а вам надо CP_ACP Цитата Ataru @ Корректнее было бы назвать Utf8ToASCII() С флагом CP_ACP, соглашусь, было бы корректнее. но у меня именно UTf8 <-> UTF16 |