web-dev-qa-db-ja.com

javaでのエンコード変換

無料のJavaライブラリを使用して、あるエンコーディングの文字列を別のエンコーディングに変換できます。 iconv ?のようなものはありますか? Javaバージョン1.3。

30
tropikalista

標準のライブラリを超えるライブラリは必要ありません- Charset を使用するだけです。 (StringコンストラクターとgetBytesメソッドだけを使用できますが、個人的には文字エンコードの名前を操作するのは好きではありません。入力ミスの余地があります。)

編集:コメントで指摘したように、Charsetインスタンスを引き続き使用できますが、Stringメソッドの使いやすさは次のとおりです。 new String(bytes、charset) and String.getBytes(charset)

RL Encoding(or: 'What are those are "%20 "URLのコード? ') "。

41
Jon Skeet

CharsetDecoder はあなたが探しているものであるべきです、いいえ?

多くのネットワークプロトコルとファイルは、ISO-8859-1ISO-Latin-1)などのバイト指向の文字セットで文字を保存します。
ただし、Javaのネイティブ文字エンコーディングは Unicode UTF16BE(16ビットUCS変換形式、ビッグエンディアンのバイト順)。

Charset を参照してください。 UTF16がデフォルトの文字セットであることを意味するわけではありません(つまり、デフォルトの16ビットのシーケンス間のマッピングnicodeコード単位およびバイトのシーケンス "):

Java仮想マシンのすべてのインスタンスにはデフォルトの文字セットがありますが、これは標準の文字セットの1つである場合とそうでない場合があります。
[US-ASCIIISO-8859-1 a.k.a. ISO-LATIN-1UTF-8UTF-16BEUTF-16LEUTF-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) {
}
19
VonC

文字列が間違ったエンコーディングを使用して元々エンコードされている場合、エラーなしで別のエンコーディングに変更することは不可能かもしれないことを付け加えたいと思います。質問は、ここでの変換が間違ったエンコーディングから正しいエンコーディングに行われたとは述べていませんが、この状況のた​​めに私は個人的にこの質問につまずきました。

他の質問のこの答えは、変換が常に正しい結果をもたらさない理由を説明します https://stackoverflow.com/a/2623793/4702806

2
wallabui

Unicodeを文字セット(実際は-それは非常に基本的にすべての既知の文字の番号付きセット)であると考えると、非常に簡単です。 UTF-8(文字ごとに1〜3バイトに依存)またはUTF-16(文字ごとに2バイトまたはサロゲートペアを使用して4バイト)としてエンコードできます。

時間の霧に戻りますJava UCS-2を使用してUnicode文字セットをエンコードしました。これは文字ごとに2バイトしか処理できなかったため、廃止されました。サロゲートペアとUTF-16に移動します。

多くの人は、そもそもUTF-8を使用すべきだったと考えています。 Javaが最初に記述されたとき、ユニコードはとにかく65535文字をはるかに超えていました...

0
Anon

UTF-8とUCS-2/UTF-16は、ファイルの先頭にあるバイトオーダーマークを介して、簡単に区別できます。これが存在する場合、ファイルがそのエンコーディングにあることはかなり良い賭けです-しかし、それは完全な確実性ではありません。また、ファイルがこれらのエンコーディングのいずれかにあるが、バイトオーダーマークがないこともわかります。

ISO-8859-2についてはあまり知りませんが、ほとんどすべてのファイルがそのエンコーディングの有効なテキストファイルであるとしても驚かないでしょう。できることは、それをヒューリスティックにチェックすることです。実際、それについて語っているウィキペディアのページは、バイト0x7fのみが無効であることを示唆しています。

ファイルを「そのまま」読み取ってテキストを取得するという考えはありません。ファイルは一連のバイトであるため、これらのバイトを文字にデコードするには文字エンコードを適用する必要があります。

Stackoverflowによるソース

0
brijesh k