LINUX.ORG.RU

Будучи скомпилированным при помощи mingw32-gcc, приложение выводит кракозябры


0

1

Здравствуйте. Скомпилировал исходник своей консольной программки в .exe при помощи утилиты из пакета mingw32-gcc. Выхлоп этой программки имеет такой вид: «╨Т╤Л╨┐╨╛╨╗╨╜╤П╨╡╤В╤Б╤П ╤Б╨╗╨╛╨╢╨╡╨╜╨╕╨╡». Как этого избежать?

Ответ на: комментарий от anonymous_sapiens

Я понял уже, как расшифровывать. Как его заставить выводить сразу на человеческом языке?

KendovNorok
() автор топика

Как этого избежать?

Ну конечно же собрать под Linux )

А так читай маны по поводу кодировок в своем виндовсе.

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

Я сейчас под Линуксом. Собрал в линуксовый бинарник, запускаю - все хорошо. Собрал в .exe, запускаю wine - все плохо. Использовать только в вайне и собираюсь.

KendovNorok
() автор топика
Ответ на: комментарий от KendovNorok

мне думается, это проблемы терминала венды/вайна.
когда я учился быдлокодить на си под виндой надо было как-то шаманить с выводом русских букв, погугли.

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

Собрал в линуксовый бинарник, запускаю - все хорошо. Собрал в .exe, запускаю wine - все плохо.

Всё верно компиляторы и сделали. Это ты не учитываешь, что твоё приложение должно выводить текст в разных кодировках в зависимости от платформы.

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

Не нашел этой команды ни в Линуксе, ни в Windows cmd.

KendovNorok
() автор топика

используйте опцию --krakozyabra=off

Но возможно у Вас не кракозябры а кракозюбры?;-)

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

Правильно хранить строки (std::wstring/QString/...) и приводить их к ANSI/UTF-8 кодировкам в соответствии с локалью.

AlexVR ★★★★★
()

SetConsoleCP/SetConsoleOutputCP function (Windows)

«╨Т╤Л╨┐╨╛╨╗╨╜╤П╨╡╤В╤Б╤П ╤Б╨╗╨╛╨╢╨╡╨╜╨╕╨╡»

cp1251

Kuzz ★★★
()
Последнее исправление: Kuzz (всего исправлений: 1)
Ответ на: комментарий от KendovNorok

Проблема в том, что в С++ нет нормальных родных инструментов для работы со строками, особенно с разными кодировками. Поэтому чаще используют сторонние библиотеки. В твоём случае Qt скорее не к месту, по этому либо долбиться с std::wstring, iconv и т.п. Либо воспользоваться ещё какой либо библиотекой, например, ICU.

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

Я совсем еще новичок. Можно ман, как, используя эту библиотеку, добиться нужного мне?

KendovNorok
() автор топика

chcp 65001

в консоле

шрифты выстави уникодные, например Consolas Andale mono Lucida

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

Так, во-первых, теперь вопросительные знаки вместо неведомых символов, во-вторых, приложение теперь не интерактивное (было интерактивным).

KendovNorok
() автор топика
Ответ на: комментарий от AlexVR

Начни с такого

#include <iostream>

int main()
{
	std::wstring ws = L"Hello, Привет!!!";
	std::setlocale(LC_ALL, "russian_Russia.866");
	std::wcout << ws;
	return 0;
}
Но сколько подводных камней ждёт тебя далее даже не знаю.

AlexVR ★★★★★
()

Лучше всего добавить флаги к GCC, чтобы он преобразовывал utf8 в ibm866. Погуглите флаги finput-encoding и foutput-encoding.

quiet_readonly ★★★★
()

Конвертнул исходники из UTF-8 в CP866. Все как по маслу. Всем спасибо, можно расходиться)

KendovNorok
() автор топика
Ответ на: комментарий от KendovNorok

Конвертнул исходники из UTF-8 в CP866. Все как по маслу. Всем спасибо, можно расходиться)

Но ведь под линукс придётся обратно конвертировать, да и с редакторами могут быть проблемы. Наиболее беспроблемное решение — автоматическая перекодировка с помощью флагов gcc.

Конверсия из utf8 в досовскую:

g++ -finput-charset=utf8 -fexec-charset=ibm866 test.cpp

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от KendovNorok

Конвертнул исходники из UTF-8 в CP866. Все как по маслу. Всем спасибо, можно расходиться)

я так всегда и делал

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

не, проще вынести строки на русском в два отдельных заголовочника, один в UTF-8, другой в CP866 и включать нужный ifdef-ами в зависимости от платформы

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

зато привязки к фичам отдельно взятого компилятора нет )

Harald ★★★★★
()

#include <tchar.h> #include <stdio.h> #include <io.h> #include <fcntl.h>

int lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); long hConHandle = _open_osfhandle(lStdHandle,_O_U8TEXT); FILE *fp = _fdopen(hConHandle,«w»); *stdout = *fp; setvbuf(stdout,NULL,_IONBF,0);

lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); hConHandle = _open_osfhandle(lStdHandle,_O_U8TEXT); fp = _fdopen(hConHandle,«w»); *sterr = *fp; setvbuf(sterr,NULL,_IONBF,0);

anonymous
()

можно еще в программа сразу сделать вызов

setlocale(LC_ALL, "");

может помочь.

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.