Javaでのエンコード変換
-
04-07-2019 - |
質問
あるエンコーディングの文字列を別のエンコーディングに変換するために使用できる無料の Java ライブラリはありますか。 iconv
?Javaバージョン1.3を使用しています。
解決
標準のライブラリを超えるライブラリは必要ありません-文字セット。 (StringコンストラクターとgetBytesメソッドだけを使用できますが、個人的には文字エンコーディングの名前を操作するのは好きではありません。入力ミスの余地が多すぎます。)
編集:コメントで指摘したように、Charsetインスタンスを引き続き使用できますが、Stringメソッドの使いやすさは次のとおりです。新しい文字列(バイト、文字セット)および文字列。 getBytes(charset)。
&quot; URLエンコード(または「 'What are these&quot; < code>%20 &quot; URLのコード? ')&quot;。
他のヒント
CharsetDecoder
はあなたが探しているものでなければなりません、いいえ?
多くのネットワークプロトコルとファイルは、 ISO-8859-1
( ISO-Latin-1
)などのバイト指向の文字セットで文字を保存します。
ただし、Javaのネイティブ文字エンコードは Unicode UTF16BE(Sixteen-ビットUCS変換フォーマット、ビッグエンディアンのバイト順)。
Charset
。これは、 UTF16
がデフォルトの文字セットであることを意味しません(つまり、16ビットの Unicodeコードユニット およびバイトシーケンス&quot;):
Java仮想マシンのすべてのインスタンスにはデフォルトの文字セットがありますが、これは標準の文字セットである場合とそうでない場合があります。
[US-ASCII
、ISO-8859-1
別名ISO-LATIN-1
、UTF-8
、< code> UTF-16BE 、UTF-16LE
、UTF-16
]
デフォルトの文字セットは、仮想マシンの起動時に決定され、通常、基盤となるオペレーティングシステムで使用されているロケールと文字セットに依存します。
この例は、 ByteBuffer
の ISO-8859-1
エンコードされたバイトを CharBuffer
の文字列に変換する方法を示しています。
// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
try {
// Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
// The new ByteBuffer is ready to be read.
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));
// Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
// The new ByteBuffer is ready to be read.
CharBuffer cbuf = decoder.decode(bbuf);
String s = cbuf.toString();
} catch (CharacterCodingException e) {
}
文字列が元々間違ったエンコーディングを使用してエンコードされている場合、エラーなしで別のエンコーディングに変更することは不可能である可能性があることを付け加えておきたいと思います。質問には、ここでの変換が間違ったエンコードから正しいエンコードに行われるとは記載されていませんが、私は個人的にこの状況のためにこの質問につまずいたので、他の人にも同様に注意してください。
他の質問のこの回答は、変換が常に正しい結果をもたらすわけではない理由を説明しています。https://stackoverflow.com/a/2623793/4702806
Unicodeを文字セット(実際は-基本的には既知のすべての文字の番号付きセット)と考えると、非常に簡単です。 UTF-8(文字ごとに1〜3バイトに依存)またはUTF-16(文字ごとに2バイトまたはサロゲートペアを使用して4バイト)としてエンコードできます。
JavaがUCS-2を使用してUnicode文字セットをエンコードするのに使用されていた時代の霧に戻ります。これは1文字につき2バイトしか処理できず、現在では廃止されています。サロゲートペアを追加してUTF-16に移行することは、かなり明らかなハックでした。
多くの人は、そもそもUTF-8を使用すべきだったと考えています。 Javaが最初に記述されたとき、ユニコードはとにかく65535文字をはるかに超えていました...
UTF-8とUCS-2 / UTF-16は、ファイルの先頭にあるバイトオーダーマークを使用して、簡単に区別できます。これが存在する場合、ファイルがそのエンコーディングにあることはかなり良い賭けです-しかし、それは完全な確実性ではありません。また、ファイルはこれらのエンコーディングのいずれかであるが、バイトオーダーマークがないこともわかります。
ISO-8859-2についてはあまり知りませんが、ほとんどすべてのファイルがそのエンコーディングの有効なテキストファイルであるとしても驚かないでしょう。できることは、ヒューリスティックにチェックすることです。実際、それについて話しているウィキペディアのページは、バイト0x7fのみが無効であることを示唆しています。
「あるがまま」のファイルを読むという考えはありません。さらにテキストを出力する-ファイルは一連のバイトであるため、これらのバイトを文字にデコードするには文字エンコードを適用する必要があります。
stackoverflowによるソース