Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.91
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
#1

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

11.11.2012, 13:44. Просмотров 3985. Ответов 11
Метки нет (Все метки)

Как у вас обстоят дела с выводом 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++. У кого-нибудь данный код работает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2012, 13:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как выводить utf-8 на экран? (C++):

Рекурсия: как выводить на экран только удовлетворяющие условия - C++
Всем привет. Есть код: #include &lt;iostream&gt; using namespace std; int values = {0}; int valuesCount = 0; //значения...

Как правильно выводить переменную типа double на экран? - C++
Помогите, плиз, как правильно выводить переменную типа double на экран ?? У меня выводится какое-то непонятное число 292057083 вместо...

Как используя цикл и массивы вводить с клавиатуры фамилии и имена, и затем выводить их на экран? - C++
Как используя цикл и массивы вводить с клавиатуры фамилии и имена и затем выводить их на экран ? Народ помогите плиз, потому что я ничего...

Конвертация из ASCII в UTF-32 или UTF-8 в UTF-32 - C++
Собсно сабж.

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

Выводить на экран кубы первых 10 простых чисел - C++
написать прогаммы которые выводить на экран кубы первых 10 простых чисел

11
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.11.2012, 14:28 #2
Цитата Сообщение от Герц Посмотреть сообщение
бросает исключение с текстом "could not create c locale". Повторяется и с mingw g++, и с vc++. У кого-нибудь данный код работает?
буду кепом.
а с чего бы ему работать под виндой? виндовс не линукс
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:41  [ТС] #3
А с чего бы ему не работать под виндой, если консоль windows умеет работать с utf-8?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 14:44 #4
Цитата Сообщение от Герц Посмотреть сообщение
std::locale( "ru_RU.UTF-8" )
В винде другой формат для локалей.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:44  [ТС] #5
Очень полезный ответ, написать корректный формат нельзя было? :-)
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.11.2012, 14:54 #6
Цитата Сообщение от Герц Посмотреть сообщение
А с чего бы ему не работать под виндой, если консоль windows умеет работать с utf-8?
потому что название локали ru_RU.UTF-8 типично для юниксов, в винде название этой локали другое
http://habrahabr.ru/post/104417/
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 14:54 #7
Например, так:
C++
1
std::locale::global(std::locale("russian_russia.1251"));
или так:
C++
1
std::locale::global(std::locale("rus"));
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.11.2012, 14:56  [ТС] #8
Такой формат я и сам знаю, меня интересовал конкретно utf-8.
russian_russia.65001 не прокатывает.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
11.11.2012, 15:04 #9
Цитата Сообщение от Герц Посмотреть сообщение
Такой формат я и сам знаю, меня интересовал конкретно utf-8.
russian_russia.65001 не прокатывает.
C++
1
2
SetConsoleCP (CP_UTF8);
SetConsoleOutputCP (CP_UTF8);
Только шрифт не знаю какой нужен.
0
Redee
17 / 18 / 3
Регистрация: 04.10.2014
Сообщений: 93
10.12.2014, 21:28 #10
Там свинья гораздо глубже зарыта!!!

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

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

Сейчас ищу вариант через модернизацию cout или аналог puts() БЕЗ принудительного перевода строки.
0
nmcf
5754 / 5065 / 1732
Регистрация: 14.04.2014
Сообщений: 20,749
10.12.2014, 22:55 #11
cout'у тоже надо локаль назначить.
0
Max Dark
шКодер самоучка
1853 / 1653 / 603
Регистрация: 09.10.2013
Сообщений: 3,679
Записей в блоге: 6
Завершенные тесты: 2
10.12.2014, 22:56 #12
Цитата Сообщение от Redee Посмотреть сообщение
puts() - выполняет верно, НО добавляет перевод строки
fputs(str, stdout); не добавляет
0
10.12.2014, 22:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 22:56
Привет! Вот еще темы с ответами:

После объявления деструктора программа перестает выводить данные на экран - C++
Помогите, плиз! Без деструктора программа работает (правда, компилятор возмущается, что их нет). После того, как я его добавляю, данные...

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

Выводить на экран вводимые символы до тех пор, пока не введен символ <*> - C++
Напишите программу, которая будет выводить на экран вводимые символы до тех пор, пока не введен символ &lt;*&gt;. Доработайте программу таким...

Выводить на экран квадраты чисел до тех пор, пока не будет введено число 0 - C++
Вводить с клавиатуры целые числа (&gt;0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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