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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Bushmeister
22 / 22 / 6
Регистрация: 19.03.2015
Сообщений: 137
#1

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

03.12.2015, 19:07. Просмотров 203. Ответов 4
Метки нет (Все метки)

Всем привет. Вопрос достаточно простой: какие типы данных поддерживают 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 To Char
C++ Из кодировки * в UTF8 и обратно в *
C++ Посимвольная обработка UTF8 строки
Перевод из unicode в ansi и utf8 C++
Преобразование String UTF8 в 1251 C++
C++ Конвертер из UTF8 - cp1251 и наоборот
C++ Utf8-Utf16 и назад. КАК?
C++ Перекодировка строки из cp1251 в UTF8
C++ Можно ли читать UTF8 в std::wstring потоком?
C++ Текст в кодировке cp1251 перевести в utf8 и обратно?
Неправильный вывод UTF8 строки вместе с setw C++
Заполнить и сохранить данные в текстовом файле в кодировке utf8 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
5101 / 4421 / 1471
Регистрация: 14.04.2014
Сообщений: 17,522
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
5101 / 4421 / 1471
Регистрация: 14.04.2014
Сообщений: 17,522
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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru