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

时间:2014-12-23 08:13:52

标签: c# c++ file-io unicode extended-ascii

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

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

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

(我的意思是,我想我可以创建一个转换器函数,它接受损坏的char-pair,比如“&amp ;;”并将它转换回单个ASCII字符,如'☺',通过一个大的ol 'if-then语句或一些巧妙推导的数学公式,但我不仅非常懒,我也非常想知道C ++ / C#如何使用非ANSI编码的txt文件处理文件I / O,如果它们确实已经实施了这样的机制!)

2 个答案:

答案 0 :(得分:1)

由于你控制双方(写一个文本文件并将其读回),事情很容易:

.net默认使用UTF-8编码。如果您使用StreamWriter()来编写文件,您可以使用StreamReader()来读取文件,并且所有字符都将在未经改变的往返过程中存活。

现在为您提供的技巧:如果您想使用外部编辑器操作此类文件,请确保编辑器能够读/写UTF-8编码。 使用记事本++,它会做。

答案 1 :(得分: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"而不是fopen)来读取数据,这应该会提供更好的性能,但是你可能需要实现一些数据解析。


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