我有一个采用 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
,这是 . 的引用可打印实体=
。