在测试文件中,我有以下测试字符串:
部類 Test《
我尝试使用带 BOM 和不带 BOM 的 UTF-8 以及 UCS-2 对文件进行编码。 我也尝试过将 Haskell 的编码设置为 UTF-8。
文本总是显示为(或更糟):
"\8745\9559\9488\920\226\191\920\237\8359 Test\960\199\232"
每当我输入 print "《"
时,代码都是 "\12298"
而不是 \960\199\232
从文件读取。
针对这种行为有什么解决方案吗?
最佳答案
猜测:您正在使用 readFile
或类似的文件,并且使用非 UTF8、非 UCS2 语言环境。您可以通过显式设置从中读取(文件句柄)和写入(stdout 或其他)的内容的编码来修复问题。例如,以下程序可以为我正确可靠地读取和写入您的测试文件:
import System.IO
main = do
hSetEncoding stdout utf8
withFile "test.txt" ReadMode $ \h -> do
hSetEncoding h utf8
s <- hGetContents h
print s
putStr s
另一个选择是使用适当的语言环境运行现有程序;例如,尝试:
LANG=en_US.utf8 runhaskell test.hs
在最常用的现代 shell 中,这将为 test.hs
中程序的单次运行适本地设置 LANG
环境变量。
关于Haskell 无法正确解析文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41169113/