0

我最近对制作/模拟 80 年代基于文本的 rpgs 产生了兴趣,比如 Rogue 及其衍生品,它们的特色图形是由扩展的 ASCII 字符组成的。因此,在为这些游戏创建和打印图形到控制台时,我认为我应该执行以下操作: 1)在记事本等文本编辑器中设计关卡等;2) 将这些文件保存为 Unicode 编码的 txt 文件,因为它们包含扩展的 ASCII;3)让我的游戏程序从这些文件中读取图形并将它们逐字打印到控制台。这对我来说似乎是一个不错的计划,除了有一个问题。

对于我的生活,我无法让程序正确输出扩展的 ASCII 字符。通常发生的情况是,程序似乎将文件中的每个单个字符作为一对 ASCII 字符读取。例如,字符 '☺' 将输出为“&;”,或类似的东西。

在 C++ 和/或 C# 中,如何正确地将 Unicode 编码的 txt 文件中的扩展 ASCII 字符逐行读取到程序中并将这些行输出到控制台窗口?

(我的意思是,我想我可以制作一个翻译函数,接收损坏的字符对,如“&;”,并将其转换回单个 ASCII 字符,如“☺”,通过一个大的 ol' if-then语句或一些巧妙推导的数学公式,但我不仅很懒,我也非常想知道 C++/C# 如何处理带有非 ANSI 编码的 txt 文件的文件 I/O,如果它们确实有这样的机制实施的!)

4

2 回答 2

1

因为你控制双方(写一个文本文件并读回来)事情很容易:

.net 默认使用 UTF-8 编码。如果您使用 StreamWriter() 写入文件,则可以使用 StreamReader() 回读文件,并且所有字符将在往返过程中保持不变。

现在给你诀窍:如果你想用外部编辑器操作这样的文件,请确保编辑器能够读/写 UTF-8 编码。使用记事本++,它会做。

于 2014-12-23T08:21:38.060 回答
0

我不太喜欢 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样式 IO 操作,而不是C++因为它可以提供更好的性能(在您的情况下不是问题,但您应该这样做)。因此,您需要使用fopen打开文件并使用fgetws读取它,在使用文件资源后,不要忘记关闭文件。

打印到控制台也必须不同(我的意思是你应该告诉你使用宽字符),所以使用fputws


另外建议,您应该使用二进制读取格式(使用"b"而不是"r"in fopen)来读取数据,这应该会提供稍微更好的性能,但您可能需要实现一些数据解析。


此外,如果您正在寻找 C++ 类型的解决方案,您可以使用流,但您需要指定您正在使用宽字符,因此使用前缀代替std::ifstream std::wifstream,而不是std::cout使用std::wcout等。w

于 2014-12-23T08:30:04.817 回答