翻译字符串的编码

时间:2015-05-13 03:57:14

标签: clojure character-encoding decode windows-1252

我有一个Windows-1252编码的字符串,但需要转换为UTF-8。

这是针对修复UTF-8文件的程序,该文件包含在quoted-printable Windows-1252中编码的俄语文本的字段。这是解码quoted-printable的代码:

(defn reencode
    [line]
    (str/replace line #"=([0-9A-Fa-f]{2})=([0-9A-Fa-f]{2})"
        (fn [match] (apply str
            (map #(char (Integer/parseInt % 16)) (drop 1 match))))))

这是最终代码:

(defn reencode
    [line]
    (str/replace line #"(=([0-9A-Fa-f]{2}))+"
        (fn [[match ignore]]
            (String.
                (byte-array (map
                    #(Integer/parseInt (apply str (drop 1 %)) 16)
                    (partition 3 match)))
                "Windows-1252"))))

它在所有连续的quoted-printable编码字符运行中使用(String. ... "Encoding")修复编码。原始函数试图解码对,因此它会跳过像=3D这样的内容,=curl -X POST -H 'Content-Type: application/json' \ --cert /etc/puppetlabs/puppet/ssl/certs/fqdn.pem \ --key /etc/puppetlabs/puppet/ssl/private_keys/fqdn.pem \ --cacert /etc/puppetlabs/puppet/ssl/certs/ca.pem \ -d '{ "name": "foo", "parent": "00000000-0000-4000-8000-000000000000", "environment": "production", "classes": {} }' \ https://fqdn:4433/classifier-api/v1/groups 的引用可打印实体。

1 个答案:

答案 0 :(得分:1)

从磁盘转换Windows-1252字符串的最佳方法是使用底层Java基元。

(def my-string (String. bytes-from-file "Windows-1252"))

将返回一个Java String,它使用Windows-1252 Charset解码了字节。从那里你可以用

的UTF-8编码将字节吐出来
(.getBytes my-string "UTF-8")

更仔细地解决您的问题,如果您有一个带有混合编码的文件,那么您可以找出分隔每个编码的内容并使用上述方法分别读取每组字节。

编辑:Windows-1252字符串已使用引用的可打印进行编码。您首先需要使用您的函数或者更优选地使用QuotedPrintable Apache Commons Codec使用decode来解码它,并传递Windows-1252 Charset。这将返回一个Java字符串,您可以直接操作而无需进一步转换。

N.B。对于某种类型的安全措施,在指定要使用的字符集时,您应该使用Java Charset对象而不是字符串(String类可以使用)。