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

Как выводить utf-8 на экран? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.91
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 13:44     Как выводить utf-8 на экран? #1
Как у вас обстоят дела с выводом UTF-8 на консоль windows? UTF-16 она не поддерживает, но похоже что у нее (или у меня) и с UTF-8 проблемы.
Имеется код:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "convert.h"
#include <iostream>
 
int main()
{
    std::wstring text = L"El es el dueГ±o de toda la tecnologГ*a.";
    std::wstring textCyrillic = L"А также немного кириллицы :-)";
 
    std::cout << Convert::utf16ToUtf8( text ) << std::endl;
    std::cout << Convert::utf16ToUtf8( textCyrillic ) << std::endl;
}
Одну строку консоль с горем пополам выводит, но стабильно обрубает первый символ, если он представляется последовательностью более чем из одного байта:
��l es el dueño de toda la tecnología.
Попробовал прилепить BOM в начале, вопросиков стало 3 (nbsp + два вопроса за первый символ).

Как оказалось, после такого вывода дальше вывести что-либо уже не выходит. Вывод второй строки не оставляет никаких следов в консоли.

Такая же ситуация с powershell, идущим в комплекте с Windows 7 SP1 x64. Не выводится даже line-feed, в итоге вывод принимает следующий вид:
��l es el dueño de toda la tecnología.PS C:\Users\Hertz\dropbox\hertz>
Под Mac OS и Linux все работает, в MinGW проблемы. С vc++ компилятором пока не пробовал.

И еще вопрос, под Windows следующий код:
C++
1
std::locale( "ru_RU.UTF-8" )
бросает исключение с текстом "could not create c locale". Повторяется и с mingw g++, и с vc++. У кого-нибудь данный код работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 13:44     Как выводить utf-8 на экран?
Посмотрите здесь:

C++ После объявления деструктора программа перестает выводить данные на экран
C++ Как правильно выводить переменную типа double на экран?
C++ Разработать программу, позволяющую вводить данные с клавиатуры и выводить их на экран с простейших форматированием
C++ Выводить на экран кубы первых 10 простых чисел
Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.11.2012, 14:28     Как выводить utf-8 на экран? #2
Цитата Сообщение от Герц Посмотреть сообщение
бросает исключение с текстом "could not create c locale". Повторяется и с mingw g++, и с vc++. У кого-нибудь данный код работает?
буду кепом.
а с чего бы ему работать под виндой? виндовс не линукс
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:41  [ТС]     Как выводить utf-8 на экран? #3
А с чего бы ему не работать под виндой, если консоль windows умеет работать с utf-8?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 14:44     Как выводить utf-8 на экран? #4
Цитата Сообщение от Герц Посмотреть сообщение
std::locale( "ru_RU.UTF-8" )
В винде другой формат для локалей.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:44  [ТС]     Как выводить utf-8 на экран? #5
Очень полезный ответ, написать корректный формат нельзя было? :-)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.11.2012, 14:54     Как выводить utf-8 на экран? #6
Цитата Сообщение от Герц Посмотреть сообщение
А с чего бы ему не работать под виндой, если консоль windows умеет работать с utf-8?
потому что название локали ru_RU.UTF-8 типично для юниксов, в винде название этой локали другое
http://habrahabr.ru/post/104417/
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 14:54     Как выводить utf-8 на экран? #7
Например, так:
C++
1
std::locale::global(std::locale("russian_russia.1251"));
или так:
C++
1
std::locale::global(std::locale("rus"));
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:56  [ТС]     Как выводить utf-8 на экран? #8
Такой формат я и сам знаю, меня интересовал конкретно utf-8.
russian_russia.65001 не прокатывает.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
11.11.2012, 15:04     Как выводить utf-8 на экран? #9
Цитата Сообщение от Герц Посмотреть сообщение
Такой формат я и сам знаю, меня интересовал конкретно utf-8.
russian_russia.65001 не прокатывает.
C++
1
2
SetConsoleCP (CP_UTF8);
SetConsoleOutputCP (CP_UTF8);
Только шрифт не знаю какой нужен.
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
10.12.2014, 21:28     Как выводить utf-8 на экран? #10
Там свинья гораздо глубже зарыта!!!

cout <<
Обрывает выполнение если встречает русские буквы

puts() - выполняет верно, НО добавляет перевод строки

Сейчас ищу вариант через модернизацию cout или аналог puts() БЕЗ принудительного перевода строки.
nmcf
4278 / 3709 / 1246
Регистрация: 14.04.2014
Сообщений: 14,503
10.12.2014, 22:55     Как выводить utf-8 на экран? #11
cout'у тоже надо локаль назначить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 22:56     Как выводить utf-8 на экран?
Еще ссылки по теме:

Для каждого введённого числа выводить на экран таблицу умножения C++
C++ Как можно сравнивать в структуре числа и выводить на экран по возрастанию, если структура находится в файле?
C++ Как используя цикл и массивы вводить с клавиатуры фамилии и имена, и затем выводить их на экран?

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
10.12.2014, 22:56     Как выводить utf-8 на экран? #12
Цитата Сообщение от Redee Посмотреть сообщение
puts() - выполняет верно, НО добавляет перевод строки
fputs(str, stdout); не добавляет
Yandex
Объявления
10.12.2014, 22:56     Как выводить utf-8 на экран?
Ответ Создать тему
Опции темы

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