Чтение из текстовых файлов с кодировкой Unicode — C ++ / C #

В последнее время я заинтересовался созданием / эмуляцией текстовых RPG из 80-х, таких как Rogue и его производные, которые содержат графику из расширенных символов ASCII. Поэтому, когда речь заходит о создании и печати графики на консоли для этих игр, я полагаю, что должен сделать следующее:
1) Дизайн уровней и еще много чего в текстовом редакторе, таком как Блокнот;
2) Сохраните эти файлы как текстовые файлы в кодировке Unicode, так как они содержат расширенный ASCII;
3) Пусть моя игровая программа прочитает графику из этих файлов и распечатает их дословно на консоли.
Мне кажется, это хороший план, за исключением одной проблемы.

На всю жизнь я не могу заставить программу правильно выводить расширенные символы ASCII. Обычно происходит то, что программа будет читать каждый отдельный символ из файла как пару символов ASCII. Например, символ ‘☺’ будет выводиться как «&;», или что-то типа того.

В C ++ и / или C # как я могу правильно читать расширенные символы ASCII из кодированных в Unicode текстовых файлов, строка за строкой, в программу и выводить эти строки в окно консоли?

(Я имею в виду, я полагаю, я мог бы сделать функцию переводчика, которая принимает поврежденную пару символов, например «&; «и преобразует его обратно в одиночный ASCII-символ, такой как ‘☺’, с помощью оператора большой if ‘if-then или некоторой умно выведенной математической формулы, но я не только довольно ленив, но и очень хотел бы быть интересно узнать, как C ++ / C # обрабатывает файловый ввод / вывод с не-ANSI-кодированными текстовыми файлами, если они действительно реализовали такие механизмы!)

0

Решение

Поскольку вы контролируете обе стороны (пишете текстовый файл и читаете его обратно), все очень просто:

.В сети по умолчанию используется кодировка UTF-8. Если вы используете StreamWriter () для записи файла, вы можете использовать StreamReader (), чтобы прочитать файл обратно, и все символы останутся без изменений.

Теперь уловка для вас: если вы хотите манипулировать таким файлом с помощью внешнего редактора, убедитесь, что редактор может читать / записывать кодировку UTF-8.
Используйте notepad ++, это подойдет.

1

Другие решения

Я не очень люблю 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 префикс.

0

По вопросам рекламы [email protected]