Chinaunix

标题: haskell 如何读入中文文件呢? [打印本页]

作者: drunkedcat    时间: 2009-05-13 09:19
标题: haskell 如何读入中文文件呢?
在 ghci 下,用 readFile 和 readUTF8File 读入中文文件,怎么显示出来都是 \xxxx\xxxx 这样的形式呢?

而用 let x = "你好" 显示的就是汉字。
那么,正确的读入中文文件的方法是什么呢?

谢谢各位了先。

注,用的是 utf8 的 locale, 文件编码也是用的 utf8。
作者: MMMIX    时间: 2009-05-13 10:35
原帖由 drunkedcat 于 2009-5-13 09:19 发表
在 ghci 下,用 readFile 和 readUTF8File 读入中文文件,怎么显示出来都是 \xxxx\xxxx 这样的形式呢?

而用 let x = "你好" 显示的就是汉字。
那么,正确的读入中文文件的方法是什么呢?

默认情况下 GHC 的 String 是不支持 UTF-8 的,你可能需要先安装 utf8-string 或类似的模块,然后使用其中的 String, readFile 等函数。
作者: drunkedcat    时间: 2009-05-14 14:08
utf8-string 在 ghc 里已经有了,还是不会用,在 google 和 google code 也没找到例子,继续摸索。
作者: MMMIX    时间: 2009-05-14 14:17
原帖由 drunkedcat 于 2009-5-14 14:08 发表
utf8-string 在 ghc 里已经有了,还是不会用,

System.IO.UTF8 提供的接口和 System.IO 提供的基本一样嘛,你碰到什么困难了?
作者: drunkedcat    时间: 2009-05-14 15:36
原帖由 MMMIX 于 2009-5-14 14:17 发表

System.IO.UTF8 提供的接口和 System.IO 提供的基本一样嘛,你碰到什么困难了?



谢谢版主,现在用一个绕弯的办法:
我发现,用 System.IO.UTF8 读进来的东西虽然在 ghci 下 show 的时候还是 unicode 数字,但是写回文件后就又是汉字了,也就是说,在文件 IO 上还是正常的,只是在调试时不能看写的是什么。先这样了,再看看 ghci 的 show 是如何处理的。
作者: flw    时间: 2009-05-14 16:30
原帖由 drunkedcat 于 2009-5-14 15:36 发表

谢谢版主,现在用一个绕弯的办法:
我发现,用 System.IO.UTF8 读进来的东西虽然在 ghci 下 show 的时候还是 unicode 数字,但是写回文件后就又是汉字了,也就是说,在文件 IO 上还是正常的,只是在调试 ...

那你就不要 show 嘛。
用 putStrLn
作者: MMMIX    时间: 2009-05-14 16:33
原帖由 flw 于 2009-5-14 16:30 发表

那你就不要 show 嘛。
用 putStrLn

对头
作者: drunkedcat    时间: 2009-05-15 17:01
楼上两位正解,多谢。

只是,为什么呢?用 putStrLn 就可以,用 show 就不可以?
作者: MMMIX    时间: 2009-05-15 17:10
原帖由 drunkedcat 于 2009-5-15 17:01 发表
楼上两位正解,多谢。

只是,为什么呢?用 putStrLn 就可以,

你用的 putStrLn 是 System.IO.UTF8 提供的。
用 show 就不可以?

show 用的是 GHCi 自己的。
作者: drunkedcat    时间: 2009-05-15 18:25
原帖由 MMMIX 于 2009-5-15 17:10 发表

你用的 putStrLn 是 System.IO.UTF8 提供的。

show 用的是 GHCi 自己的。


我试了一下,不加载 System.IO.UTF8, 直接用 prelude 的 readFile 和 putStrLn ,是一样的结果。能正常显示汉字。
作者: MMMIX    时间: 2009-05-15 19:04
原帖由 drunkedcat 于 2009-5-15 18:25 发表


我试了一下,不加载 System.IO.UTF8, 直接用 prelude 的 readFile 和 putStrLn ,是一样的结果。能正常显示汉字。

OK, bad guess
作者: flw    时间: 2009-05-19 14:26
原帖由 drunkedcat 于 2009-5-15 17:01 发表
楼上两位正解,多谢。

只是,为什么呢?用 putStrLn 就可以,用 show 就不可以?

因为 show 和 putStrLn 不等价。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2