Форум программистов, компьютерный форум CyberForum.ru

UTF8 в C++ или killmepls - C++

Восстановить пароль Регистрация
 
Bushmeister
22 / 22 / 6
Регистрация: 19.03.2015
Сообщений: 137
03.12.2015, 19:07     UTF8 в C++ или killmepls #1
Всем привет. Вопрос достаточно простой: какие типы данных поддерживают UTF8 символы в CPP? Сторонние библиотеки не интересуют. char* насколько мне известно, не поддерживает UTF8. Что по поводу wchar_t и std::string?
Логично, что для wchar_t нужны wcin, wcout, но wcout вообще ничего не выводит (как же я ненавижу строки в c++ ...). Может ли std::string хранить utf8 символы? Понятно, что size length будут работать некорректно т.к они считают байты.
Мне необходимо корректно работать с utf8 символами для сохранения(чтения) файлов / закачки страниц из интернета кодированных в utf8 и прочего. Какой простейший способ существует? В C# все было гораздо проще, но возвращаться к .NETу и String^ не хочется, иначе бы сразу писал на шарпе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2015, 19:07     UTF8 в C++ или killmepls
Посмотрите здесь:

C++ Посимвольная обработка UTF8 строки
C++ Utf8-Utf16 и назад. КАК?
C++ UTF8 To Char
Преобразование String UTF8 в 1251 C++
C++ Текст в кодировке cp1251 перевести в utf8 и обратно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
03.12.2015, 19:15     UTF8 в C++ или killmepls #2
Цитата Сообщение от Bushmeister Посмотреть сообщение
Какой простейший способ существует?
Цитата Сообщение от Bushmeister Посмотреть сообщение
char* насколько мне известно, не поддерживает UTF8
char это вообще только байты, так что поддерживает, просто нужно будет писать свою реализацию для UTF-8, например, посмотрите на реализацию ustring из Glib.
Цитата Сообщение от Bushmeister Посмотреть сообщение
Может ли std::string хранить utf8 символы? Понятно, что size length будут работать некорректно т.к они считают байты.
может, но естественно, нужно будет запись/доступ/размер велосипедить.
nmcf
4315 / 3736 / 1259
Регистрация: 14.04.2014
Сообщений: 14,642
03.12.2015, 19:26     UTF8 в C++ или killmepls #3
Файлы utf8 открываются и сохраняются с помощью codecvt и обычных потоков, путём преобразования в wchar_t и назад.
Bushmeister
22 / 22 / 6
Регистрация: 19.03.2015
Сообщений: 137
03.12.2015, 21:13  [ТС]     UTF8 в C++ или killmepls #4
Никто толком не ответил про в wchar_t. В итоге, что можно найти нормального для utf8 строк? В чем смысл wchar_t и char, если ни там, ни там нет нормального чтения/записи utf8?
Ну и наконец, почему такой бред творится в C++?

Добавлено через 9 минут
А что по поводу winapi строк? LPCWSTR LPCTSTR TCHAR? Для чего функция Text()?
Правильно ли это? Будет нормально восприниматься utf8? Русские буквы должны записываться нормально? А что по поводу остальных символов utf8?
nmcf
4315 / 3736 / 1259
Регистрация: 14.04.2014
Сообщений: 14,642
03.12.2015, 21:34     UTF8 в C++ или killmepls #5
А ты толком и не спросил. Что делать хочешь? Работать с файлами utf8? Я же сказал - через codecvt, это стандартная возможность. Непосредственно с utf8 работать неудобно, хотя библиотеки такие вроде бы есть, поэтому он преобразуется в wchar_t для обработки.
TCHAR - это такой тип, придуманный в Microsoft, который либо char, либо wchar_t в зависимости от настроек. Но вот что касается универсальности - всё зависит от используемого набора символов. Возьмёшь какой-нибудь экзотический символ и он в старой кодировке не сработает.
В WinAPI не используется utf8, функции на utf16 работают, хотя средства перекодирования туда и обратно имеются.
Короче говоря, схема такая: преобразуешь в wchar_t и работаешь, а сохранить можно перекодировав назад.

Добавлено через 6 минут
Вот открытие файла utf8. Текст сразу преобразуется в wchar_t:
C++
1
2
3
4
std::wifstream ifile(L"data.txt");
ifile.imbue(locale(locale(), new std::codecvt_utf8<wchar_t, 0x10ffffUL, std::codecvt_mode::consume_header>));
std::wstring s;
std::getline(ifile, s);
Yandex
Объявления
03.12.2015, 21:34     UTF8 в C++ или killmepls
Ответ Создать тему
Опции темы

Текущее время: 09:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru