Получение встроенной программы Dev-C++ для вывода символов UNICODE в командную строку Windows

Если бы вы могли ответить на любой из моих вопросов, это было бы здорово.

Вот сенсация: я веду вводный курс по программированию в Таиланде для 11-классников. До сих пор все шло отлично, их уровень английского языка достаточно высок, чтобы я мог преподавать на английском языке и заставлять их писать программы на английском языке, и все в порядке.

Однако, как носители языка с нелатинскими символами, я считаю, что они должны хотя бы узнать, что такое UNICODE. Я не буду тестировать их на этом или утомлять деталями реализации, но я хочу показать им пример программы UNICODE, которая может выполнять ввод-вывод с тайскими символами.

Я работаю в соответствии со следующими ограничениями, ни одно из которых не может быть изменено (по крайней мере, в этом семестре):

  • Программа должна работать на Windows 7
  • Программа должна быть на C (не C++)
  • Мы должны использовать Dev-C++ (v. 4.9.9.3) в качестве нашей IDE (я попытаюсь убедить администраторов измениться в следующем семестре, но они могут не захотеть)
  • Программа должна выводиться в командную строку (мне бы хотелось, чтобы она «выглядела» как программы, которые мы писали до сих пор)
  • Я хочу, чтобы его было легко настроить и запустить, хотя я не возражаю против включения пакетного файла, чтобы выполнить некоторую настройку для детей.

Вот как далеко я продвинулся, и вопросы, которые у меня есть:

  • В Панели управления> Регионы> Администрирование> Язык для программ, отличных от UNICODE, установлен на тайский.
  • Я использовал «chcp 874», чтобы установить тайскую кодовую страницу в командной строке. , но символы с клавиатуры появляются как мусорные символы. Это может быть из-за того, что раскладки клавиатуры неправильные, или мне нужно что-то еще изменить?
  • Я написал программу со строкой: printf("ก\n"); который печатает ก, первую букву тайского алфавита. Это правильный синтаксис?
  • Я получил предупреждение компилятора о том, что «Универсальные символы поддерживаются только в C++ и C99». Dev-C++ не компилируется в C99? Есть ли способ получить для него компилятор C99?
  • Я запустил код и получил мусорные символы. Я предполагаю, что это может быть из-за компилятора, командной строки или множества других вещей.

Я хотел бы закончить этот курс программой, которая выводит สวัสดีโลก, тайский эквивалент "Hello World!" Я много гуглил, но каждый ответ, который я нашел, либо не работает в этом конкретном случае, либо связан с другой IDE.


person user2571032    schedule 11.07.2013    source источник


Ответы (3)


Хорошо, вот моя небольшая помощь. Я не использую Dev-C++ в качестве своей IDE, поэтому я не могу помочь вам с конкретными вещами IDE, но следующее является стандартным для большинства компиляторов C/C++:

wprintf — это реализация printf для широких символов (юникод).

При использовании широких символов вы будете использовать wchar_t вместо char для определения строк.

так что вы можете сделать что-то вроде этого

#include <wchar.h>

int main(int argc, char** argv) {
    wchar_t* str = L"สวัสดีโลก";
    wprintf(L"%s", str);
    system("pause");
    return 0;
}

wprintf скорее всего то, что вы ищете.

Другие функции для печати широких строк и управления ими можно найти, изучив заголовочный файл wchar.h.

Ссылка: wprintf — справочник по C++

Использование L перед кавычками означает, что вы собираетесь определить широкую строку. (юникод)

Надеюсь, это поможет,

-Дэйв

person Community    schedule 11.07.2013
comment
Я перешел на широкие символы и последовал совету Ахмеда по поводу широких символов. Он по-прежнему не отображается должным образом в cmd, но я перенаправил вывод в текстовый файл, и он отобразился там правильно, поэтому теперь вывод определенно правильный. Спасибо! - person user2571032; 11.07.2013
comment
Возможно, вы захотите изменить шрифт командной строки на тот, который поддерживает символы Юникода, поскольку я не думаю, что шрифт терминала их поддерживает. Добро пожаловать, я надеюсь, что ваш класс работает хорошо для вас. - person ; 12.07.2013

Я никогда не использовал DEV-C++ IDE :-) Однако, немного почитав об этом, я увидел, что dev-c++ версии 4.9.9.3 использует порт gcc-3.5.4 mingw. Который имеет универсальный статус поддержки символов «Готово», см. http://gcc.gnu.org/gcc-3.4/c99status.html для получения подробной информации. Вы должны изменить конфигурацию IDE таким образом, чтобы компилятор использовал -std=c99 как часть флагов компилятора.

Надеюсь, это поможет.

Я попытаюсь поиграть с этим на своей собственной системе и посмотрю, как далеко мы сможем продвинуться. Обновлю ответ, если найду больше подсказок :-)

person Ahmed Masud    schedule 11.07.2013
comment
Я установил этот флажок и последовал совету Дейва по поводу широких символов. Он по-прежнему не отображается должным образом в cmd, но я перенаправил вывод в текстовый файл, и он отобразился там правильно, поэтому теперь вывод определенно правильный. Спасибо! - person user2571032; 11.07.2013

Если вам нужно изменить кодовую страницу в консольной программе C, вы можете добавить заголовок <stdlib.h> и строку system("CHCP 874"); в начало программы.

Если вам нужен бесплатный компилятор, соответствующий C99 для Windows, вы можете попробовать Pelles C:

http://www.christian-heffner.de/index.php?page=download&lang=en

Он полностью соответствует C99.

Вы должны использовать широкострочные константы, которые имеют следующий синтаксис:

L"Wide string\n"

Вместо printf() вам нужно использовать wprintf() и тому подобное.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/wchar.h.html

person pablo1977    schedule 29.08.2013