3

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

这适用于修复 UTF-8 文件的程序,该文件的字段包含以可引用打印的 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"))))

它修复了(String. ... "Encoding")在所有连续运行的引用打印编码字符上使用的编码。原始函数试图解码对,因此它会跳过诸如的内容=3D,这是 . 的引用可打印实体=

4

1 回答 1

1

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

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

将返回一个 Java 字符串,它使用 Windows-1252 Charset解码了字节。从那里您可以使用 UTF-8 编码将字节吐出

(.getBytes my-string "UTF-8")

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

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

请注意,为了某种类型的安全性,在指定要使用的字符集时,您可能应该使用 Java Charset对象而不是字符串(String 类可以采用其中任何一种)。

于 2015-05-13T06:32:28.317 回答