clojure中的文本编码转换

spi*_*ike 5 encoding clojure

我想写一个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
Run Code Online (Sandbox Code Playgroud)

现在我们可以将它转换为UTF-8,如下所示:

$ iconv -f ISO-8859-1 -t UTF-8 iso.txt | hexdump
0000000 c3 a8 0a                                       
0000003
Run Code Online (Sandbox Code Playgroud)

我该如何在clojure中写出相同的东西?我很高兴使用任何外部库,但我不知道我会去哪里找到它们.环顾四周,我无法弄清楚如何在JVM上使用libiconv本身,但可能还有另一种选择吗?

编辑

在评论中阅读Alex的链接之后,这非常简单而且很酷:

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")
"è"
Run Code Online (Sandbox Code Playgroud)

Jar*_*314 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
Run Code Online (Sandbox Code Playgroud)

注意: slurp如果您未指定编码,则将采用UTF-8.