LINUX.ORG.RU

Вывод Unicode строки в Windows

 , ,


0

1

Добрый день. Не понимаю, как правильно в Windows вывести строку с русскими буквами. Без юникода, понятно, выводятся странные символы.

В итоге в настройках проекта Visual Studio выбрал Use Unicode character set, пишу такой код:

include<iostream>
include<tchar.h>

int main(int argc, _TCHAR** argv)
{
   cout<<L"Работа завершена"<<endl;
   //или так: cout<<_T("Работа завершена")<<endl;
   return 0;
}

Но при запуске этого кода в виндоусовской консоли, она выводит и не странные символы и не русскую фразу «Работа завершена», а вообще какой-то шестнадцатеричный код 00F84208

Подскажите пожалуйста, в чем причина? Может дело в кодировке вывода самой консоли? Хотя системные сообщения Windows она исправно на русском пишет.

Шindows cannot into Unicode. Deal with it.

Lincor ☆
()

Походу линукс тут не причем, кодировка в cmd винды 866.

ilovewindows ★★★★★
()
Последнее исправление: ilovewindows (всего исправлений: 1)
#include <locale.h>
setlocale (LC_ALL,"Russian");
sudopacman ★★★★★
()
Ответ на: комментарий от annulen

chcp 65001

Не очень здорово, если требуется переносимость, на каждом профиле придётся ручками ставить этот шрифт. Лучше, если есть возможность, под 866 кодировку приспособиться.

Dreamject ★
()
Ответ на: комментарий от annulen

Если речь о запуске из консоли, то нужно в каждой (скорее всего) включить шрифт, поддерживающий вывод кириллицы из отличных кодировок. Все ли ломанутся это делать?

Dreamject ★
()

Может дело в кодировке вывода самой консоли?

Именно так. В винде в консоли однобайтная кодировка, зависящая от локали, но отличающаяся от Юникода и от однобайтной кодировки для функций Windows API. Для русской версии Винды это CP866. Попробуй переключить консоль на UTF-8: https://stackoverflow.com/questions/388490/unicode-characters-in-windows-comm...

proud_anon ★★★★★
()
Ответ на: комментарий от annulen

Для переносимости как раз лучше utf8 использовать, а не подстраиваться под ущербные системы :)

Переносимого способа выводить юникод в консоль нет.

x3al ★★★★★
()
Ответ на: комментарий от Dreamject

866 кодировку

Вот почему в каждой теме «юникод в виндовой консоли» кто-нибудь обязательно влезет с CP866? Виндовый эмулятор терминала юникоден и умеет в UTF-16, но нет, нужно пользоваться legacy, тянущимся уже фиг знает сколько лет.

x3al ★★★★★
()
Ответ на: комментарий от proud_anon

В винде в консоли однобайтная кодировка, зависящая от локали, но отличающаяся от Юникода и от однобайтной кодировки для функций Windows API. Для русской версии Винды это CP866.

В общем случае она ничерта не однобайтная, поскольку в моей консоли спокойно отображаются иероглифы. CP65001 — фигово поддерживаемое решение, поскольку все остальные виндовые утилиты, даже те, что умеют в юникод (UTF-16 без всяких chcp), будут странно работать: chcp попутно меняет язык отображения.

x3al ★★★★★
()
Ответ на: комментарий от x3al

В общем случае она ничерта не однобайтная, поскольку в моей консоли спокойно отображаются иероглифы.

Да, правильно. Следовало сказать: «кодировка, отличная от Юникода».

proud_anon ★★★★★
()
Ответ на: комментарий от x3al

Виндовый эмулятор терминала юникоден и умеет в UTF-16, но нет, нужно пользоваться legacy, тянущимся уже фиг знает сколько лет.

Речь ведь о шрифте, если ты Лусиду или что-то юникодное, а не пиксельный дефолт, не выберешь, то даже при правильной кодировке будет херня.

Dreamject ★
()
Ответ на: комментарий от Dreamject

chcp — жуткий костыль и не нужно. На какой чёрт тебе менять кодировку для legacy-софта, не умеющего в юникод, если можно нативным способом писать в UTF-16 независимо от того, на что там сменили кодировку?

x3al ★★★★★
()
Ответ на: комментарий от Dreamject

Берёшь http://www.madore.org/~david/misc/unitest/ и сохраняешь как UTF-16 текст. Делаешь type (cmd) или gc (он же cat) в powershell, убеждаешься, что chcp нафиг не нужен.

WriteConsoleW если нужно в C.

*.bat — наследие времён DOS, не упоминай это к ночи. Пишешь что угодно в ps1-файл, сохраняешь как UTF-16 текст и запускаешь мощношеллом, получаешь юникод в том же окне connhost'а, что и cmd.exe и с тем же дефолтным растровым шрифтом в пределах его возможностей. Возможности шрифта (допустимые символы), конечно, зависят от кодировки, но пока ты в ней — никакие chcp не нужны.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.