Clojure中的文本编码翻译

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本身,但可能有其他选择? 编辑 在阅读了评论中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")
"è"

1
澄清一点:Java中的字符串(因此也包括Clojure)被定义为Unicode字符序列,因此始终具有相同的表示形式。只有在字符串/字符与底层字节之间进行转换时,才会涉及编码。 - Alex
@alex 我明白了,但是如果我要在字节级别上操作,该怎么做呢?有没有一种方法可以将十六进制值e8转换为Unicode字符'è'的字符串? - spike
1
我建议阅读这篇文章:http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html - Alex
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。


谢谢!接受这个答案,因为它解答了我大部分的疑惑。 - spike
你如何转换字符串的编码? - Zaz
非常感谢。就我的情况而言(我知道我的UTF16仅包含Latin1):(defn convert_utf16_to_latin1 [file-in file-out] (spit file-out (slurp file-in :encoding "UTF-16") :encoding "ISO-8859-1")) - beloblotskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接