使用 Unicode 编码从 txt 文件读取 -- C++/C#

本文关键字:C++ 读取 文件 Unicode 编码 txt 使用 | 更新日期: 2023-09-27 18:35:00

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

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

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

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

使用 Unicode 编码从 txt 文件读取 -- C++/C#

由于您可以控制双方(编写文本文件并读回它(,因此事情非常简单:

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

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

我不太喜欢 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。


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


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