В последнее время я заинтересовался созданием / эмуляцией текстовых RPG из 80-х, таких как Rogue и его производные, которые содержат графику из расширенных символов ASCII. Поэтому, когда речь заходит о создании и печати графики на консоли для этих игр, я полагаю, что должен сделать следующее:
1) Дизайн уровней и еще много чего в текстовом редакторе, таком как Блокнот;
2) Сохраните эти файлы как текстовые файлы в кодировке Unicode, так как они содержат расширенный ASCII;
3) Пусть моя игровая программа прочитает графику из этих файлов и распечатает их дословно на консоли.
Мне кажется, это хороший план, за исключением одной проблемы.
На всю жизнь я не могу заставить программу правильно выводить расширенные символы ASCII. Обычно происходит то, что программа будет читать каждый отдельный символ из файла как пару символов ASCII. Например, символ ‘☺’ будет выводиться как «&;», или что-то типа того.
В C ++ и / или C # как я могу правильно читать расширенные символы ASCII из кодированных в Unicode текстовых файлов, строка за строкой, в программу и выводить эти строки в окно консоли?
(Я имею в виду, я полагаю, я мог бы сделать функцию переводчика, которая принимает поврежденную пару символов, например «&; «и преобразует его обратно в одиночный ASCII-символ, такой как ‘☺’, с помощью оператора большой if ‘if-then или некоторой умно выведенной математической формулы, но я не только довольно ленив, но и очень хотел бы быть интересно узнать, как C ++ / C # обрабатывает файловый ввод / вывод с не-ANSI-кодированными текстовыми файлами, если они действительно реализовали такие механизмы!)
Поскольку вы контролируете обе стороны (пишете текстовый файл и читаете его обратно), все очень просто:
.В сети по умолчанию используется кодировка UTF-8. Если вы используете StreamWriter () для записи файла, вы можете использовать StreamReader (), чтобы прочитать файл обратно, и все символы останутся без изменений.
Теперь уловка для вас: если вы хотите манипулировать таким файлом с помощью внешнего редактора, убедитесь, что редактор может читать / записывать кодировку UTF-8.
Используйте notepad ++, это подойдет.
Я не очень люблю C #, так что вот пример для C ++
#include <stdio.h>
int main()
{
FILE * pFile;
wchar_t mystring [100];
pFile = fopen ("myfile.txt" , "r");
if (pFile != NULL)
{
if ( fgetws (mystring , 100 , pFile) != NULL )
fputws ( mystring, stdout );
fclose (pFile);
}
return 0;
}
Я предлагаю использовать C
операции ввода-вывода стиля, не C++
потому что это дает лучшую производительность (не проблема в вашем случае, но вы должны это сделать). Так что вам нужно открыть файл с помощью Еореп и читать это с помощью fgetws, также после использования файловых ресурсов не забудьте закрыть файл.
Кроме того, печать на консоли должна отличаться (я имею в виду, что вы должны сказать, что вы используете широкие символы), поэтому используйте fputws.
Также дополнительные предложения, вы должны использовать двоичный формат чтения (используйте "b"
вместо "r"
в fopen
) для чтения данных, что должно дать немного лучшую производительность, но вам может потребоваться реализовать некоторый анализ данных.
Также, если вы ищете решение типа C ++, вы можете использовать потоки, но вам нужно указать, что вы работаете с широкими символами, поэтому вместо std::ifstream
std::wifstream
, вместо std::cout
использование std::wcout
и т. д. с использованием w
префикс.