2010-12-14 15 views
0

私が解決しようとしている問題は、ユニコード記憶タイプ間の変換です。私が理解するように、UTF-8の1文字は1〜4バイトのデータで表現できますが、UTF-16の文字は1〜2バイトのデータブロックで表現できます。この可変長は、2つの間で変換して英語で賢明なものを生成することは苦痛であることを意味します。私が探しています何文字エンコーディング間で変換するためのJavaライブラリ

は、私は言語またはロケール、およびストレージ・メカニズム(UTF-8など)を指定し、それがより賢明な結果を生み出す持って聞かせライブラリです。私は雲の中で夢を見ていますか?

+1

「英語で分かりやすい」とは、具体的にはどういう意味ですか?英語で分かりやすいかどうかは、エンコーディングとは関係ありません。あるエンコーディングから別のエンコーディングに変換するだけであれば、Hermsの答えは正しいです。 –

+0

私は知っている、それはエンコーディングとは無関係です。私は、あるエンコーディングから別のエンコーディングに変換する以上のことをしたい。私はロケールを与えられた別のエンコーディングに変換したいと思います。結果が得意です(ロケールが英語を表している場合は英語の辞書で参照できます) – stevebot

答えて

3

String.getBytes(String charsetname)は十分ではありませんか?

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#getBytes(java.lang.String)

それはあなたが特定のエンコーディングで文字列の生のバイトを取得することができます。

文字列は、[コンストラクタ]あなたは復号化のためにそれを使用することができますので、[2]、同様にバイト配列と文字セットの名前を取る持っています。

[2]:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String(byte []、java.lang.String)

+0

あなたが指定したエンコードは何でも、私が理解する限り、ダムです。つまり、utf-16のutf-8文字列 "hello"の英語で最良の表現を生成することを目指しているわけではありません。 – stevebot

+0

私はあなたのUTF-8文字列を取り、そこから文字列を作成すると言っています。次に、getBytes()を使用して、その文字列を必要なUTF-16バイト(または使用する入出力の組み合わせ)に変換します。 – Herms

+0

奇妙なことに、私の2番目のリンクはプレビューのリンクとして表示されますが、実際のページには表示されません。 – Herms

2

コンストラクタString(byte []、Charset)を使用して、1つのエンコーディングのバイトをJava Stringに変換できます。サポートされている文字セットはjava.nio.charset.Charsetにリストされています。

その後、String.getBytes(CharSet)と異なるエンコーディングでバイトに戻って変換することができます。例えば

byte[] bytesIn = ...; 
String s = new String(bytesIn, Charset.forName("UTF-8"); 
byte[] bytesOut = s.getBytes(Charset.forName("UTF-16")) 
2

それは、文字セットの多くのために賢明です。 Unicodeに収まらないものはまだいくつかありますが、多くはありません。

最初に、変換する必要のある文字を処理するために、バイトが文字ではないことを覚えておいてください。通常、最も簡単な方法は、バイトストリームを適切なもので構成されたリーダー(またはライター)エンコード/デコードセット。直接サポートされているエンコーディングのリストについては

here's what comes with the JVM

キーは、プラットフォームのエンコーディングを使用するため、デフォルトのリーダとライターを使用しません。代わりに1つのエンコードを選択します。 UTF-8はディスクサイズが良好で、エンコード/デコードのパフォーマンスが劣ります。 UTF-32はディスクサイズには恐ろしいもので、エンコード/デコードのパフォーマンスが優れています。 UTF-16は妥協の一種です。すべてのUTFベースのエンコーディングは、ASCII文字をより効率的に処理するために最適化されているため、ASCIIのみを扱う場合はUTF-8がUTF-16を上回る可能性があります。

バイトを新しい文字セットに変換できないことに注意してください。新しい文字セットに「キャスト」されます。つまり、バイトを新しい文字セットに変換する場合は、それらを文字列または文字に変換し、新しい文字セットの文字列のバイトを取得する必要があります。独自の指定された文字セットをInputStreamとしてバイトストリームを読み込むための

一つの方法は、InputStreamReader constructed with an alternate character setを使用することです。同様に、代替文字セットで構築されたOutputStreamWriterを使用する必要があります。

あなたが直接管理しないすべてのファイルは、プラットフォームの文字セットを使用する必要があります(これはおそらくそれらのものです)ので、保存またはプログラムへの入力時に選択した文字セットに変換する必要があります。

+0

私はutf-8とutf-16の両方がユニコードを表していることを知っていますが、それは違うのですか?それらの間で変換する際に、常に単語の表現が失われることはありませんか? – stevebot

+0

いいえ、損失の可能性はありません。 UTF-8は8ビットの記憶域ブロックを使用してUTF-32を表現しようとします。基本的に、8ビット(すべてのオーバーヘッドを除く)内のすべてを表現できない場合、余分な情報を処理するために8ビットのブロックを追加し始めます。これは数字の先行ゼロをトリミングするのと同様です。 UTF-16は基本的に同じことをしますが、余分なストレージを追加する際のルールはそれほど複雑ではなく、より多くのビットで始まるので、複数のブロックに1つの文字を少なく格納する必要があります。 UTF-32は32ビットを使用し、何もトリムせず、拡張も必要ありません。 –

関連する問題