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 она исправно на русском пишет.

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

ilovewindows ★★★★★ ()
Последнее исправление: ilovewindows (всего исправлений: 1)
Ответ на: комментарий от 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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.