我最近开始兴趣于制作/模仿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,如果它们确实已经实施了这样的机制!)
答案 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
等。