5

我想编写一个 clojure 函数,它采用一种编码方式获取字符串并将其转换为另一种编码方式。iconv 库就是这样做的。

例如,让我们看一下字符“è”。在 ISO-8859-1 ( http://www.ascii-code.com/ ) 中,这e8是十六进制的。在 UTF-8 ( http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%C3%A8&mode=char ) 中,它是c3 a8.

假设我们有 iso.txt,其中包含我们的信件和 EOL:

$ hexdump iso.txt                               
0000000 e8 0a                  
0000002

现在我们可以像这样将其转换为 UTF-8:

$ iconv -f ISO-8859-1 -t UTF-8 iso.txt | hexdump
0000000 c3 a8 0a                                       
0000003

我应该如何在clojure中写一些等效的东西?我很乐意使用任何外部库,但我不知道在哪里可以找到它们。环顾四周,我不知道如何在 JVM 上使用 libiconv 本身,但可能还有其他选择?

编辑

在阅读了评论中亚历克斯的链接后,这太简单了,太酷了:

user> (new String (byte-array 2 (map unchecked-byte [0xc3 0xa8])) "UTF-8")
"è"

user> (new String (byte-array 1 [(unchecked-byte 0xe8)]) "ISO-8859-1")
"è"
4

1 回答 1

8

如果您想要一个简单的整个文件到 UTF-8 的转换,slurp允许使用该:encoding选项指定文件编码,并且spit默认输出 UTF-8。此方法会将整个文件读入内存,因此大文件可能需要不同的方法。

$ printf "\xe8\n" > iso.txt
$ hexdump iso.txt
0000000 e8 0a                                          
0000002

(spit "/Users/path/iso2.txt"
      (slurp "/Users/path/iso.txt" :encoding "ISO-8859-1"))

$ hexdump iso2.txt
0000000 c3 a8 0a                                       
0000003

注意: slurp如果您不指定编码,将采用 UTF-8。

于 2013-09-13T20:26:22.960 回答