3

Windows-1252 エンコーディングの文字列がありますが、UTF-8 に変換する必要があります。

これは、 quoted-printable Windows-1252でエンコードされたロシア語のテキストを含むフィールドを持つ UTF-8 ファイルを修正するプログラム用です。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")これは、quoted-printable-encoded 文字のすべての連続実行で使用するエンコーディングを修正します。元の関数はペアをデコードしようとしていたため=3D、 の引用された印刷可能なエンティティであるなどをスキップし=ます。

4

1 に答える 1

1

Windows-1252 文字列をディスクから変換する最善の方法は、基盤となる Java プリミティブを使用することです。

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

Windows-1252 Charsetでバイトをデコードした Java String を返します。そこから、UTF-8エンコーディングでバイトを吐き出すことができます

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

質問にもっと詳しく答えると、エンコーディングが混在するファイルがある場合、各エンコーディングを区切るものを特定し、上記の方法を使用して各バイトセットを個別に読み取ることができます。

編集: Windows-1252 文字列は、印刷可能な引用符でエンコードされています。最初に、関数を使用して、またはより好ましくはQuotedPrintable decodeを使用してApache Commons Codecでデコードし、Windows-1252 Charset を渡す必要があります。これにより、それ以上変換せずに直接操作できる Java 文字列が返されます。

注意: 型の安全性を確保するために、使用する文字セットを指定するときは、おそらく String ではなくJava Charsetオブジェクトを使用する必要があります (String クラスはいずれかを取ることができます)。

于 2015-05-13T06:32:28.317 に答える