我发现了一个奇怪的问题,即通过writeFile
将中文字符写入文件。
> writeFile "r.txt" "过" -- outputting as expected.
> writeFile "r.txt" "图" -- not displaying as expected. see the following:
然后发生了一些陌生的事情:
> writeFile "r.txt" "图画" -- outputting is normal, as follows:
显示混乱代码的更多示例:
> writeFile "r.txt" "士"
> writeFile "r.txt" "十"
> writeFile "r.txt" "千"
> writeFile "r.txt" "一"
> writeFile "r.txt" "一千十士图" -- This is displayed as messy codes.
但以下是正常的:
> writeFile "r.txt" "一千十士图画" -- This is normal.
如果将上面的字符与可以正常显示的其他字符(例如writeFile "r.txt" "十过"
)一起导出,这是正常的。
我不知道为什么会这样:
- 为什么有些字符输出为乱码而其他字符则没有?事实上,“一千十士图”是中文中最常用的字符。
- 为什么导出为乱码的字符可以与其他可以正常显示的字符一起正常显示?
如果有人能提供一些信息我很感激。
答案 0 :(得分:4)
首先,这是一个很好的问题。即使是现在,编码问题仍然是一个问题。 Windows uses UTF-16 by default now,而Haskell的大部分是在UTF-8平台上开发的。 System.IO
函数使用的实际编码在运行时没有明确定义,因为它是由平台环境设置的,或者如果不是任意选择的话。
要做的第一件事就是切换到Data.Text
进行文本处理。这不仅更能了解编码,而且比String
的“字符列表”模型更有效。它的own I/O functions也考虑了特定的编码。
为了简化这一过程,启用OverloadedStrings
将非常有帮助。此外,由于您正在使用字符串文字,因此在GHC编译时检查源代码文件编码是否与环境匹配也会有所帮助。有很多地方处理这些数据,并且在某一点上,从一个已知良好的文件加载你的字符串最终不会比把它们放在源代码中那么头痛。