2009-03-16 20 views
56

文字列をISO-8859-1からUTF-8に変換してJavaで戻す方法は誰にも分かりますか?JavaでISO-8859-1とUTF-8をどのように変換できますか?

Webから文字列を取得してRMS(J2ME)に保存していますが、特殊文字を保持してRMSからISO-8859-1エンコーディングを使用して文字列を取得します。これはどうすればいいですか?

+0

[Javaで変換をエンコード]の可能性のある重複します(http://のstackoverflow。com/questions/229015/encoding-conversion-in-java) – kamaci

答えて

87

はそのようなInputStreamReaderを使用(エリクソンのおかげで)あなたはbyte[]に読み、その後

byte[] bs = ...; 
String s; 
try { 
    s = new String(bs, encoding); 
} catch(UnsupportedEncodingException uee) { 
    uee.printStackTrace(); 
} 

またはより良いを使用してStringにそれを変換することができ、あなたはInputStreamを持っていると言います

一般的に、これはできません。 UTF-8は、あらゆるUnicodeコードポイントをエンコードすることができます。 ISO-8859-1は、そのうちのほんの一部しか処理できません。したがって、ISO-8859-1からUTF-8へのトランスコードは問題ありません。 UTF-8からISO-8859-1に戻ると、サポートされていない文字が見つかった場合にテキストに "置換文字"(�)が表示されます。あなたは低レベルCharsetのAPIを使用して、より制御を行うことができます

byte[] latin1 = ... 
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8"); 

または

byte[] utf8 = ... 
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1"); 

:テキストをトランスコードする

。たとえば、エンコード不可能な文字が見つかった場合に例外を発生させたり、置換文字として別​​の文字を使用したりすることができます。ここで

+1

文字エンコーディングの詳細と、UTF-8からISO-8859(またはASCIIまたはANSIの場合)の意味合いが合理的でない理由については、この説明を参照してください。http://www.joelonsoftware.com /its/Unicode.html –

+0

このリンクからの要約は次のとおりです。「いくつかのコードポイントを正しく保存し、他のコードポイントをすべて疑問符に変える従来のエンコーディングが何百もあります。いくつかの英語テキストのエンコードは、Windows-1252(西欧言語のWindows 9x標準)とLatin-1(別名西欧言語のISO-8859-1)です。しかし、これらのエンコーディングにロシア語やヘブライ語の文字(または特殊文字)を格納しようとすると、疑問符がたくさんあります。 UTF 7,8,16、および32は、すべてのコードポイントを正しく保存できる優れた特性を持っています。 ' –

+0

Windows-1252(Windows Latin 1)はISO-8859-1(公式のLatin 1 ) "Unicode control"文字0x80 - 0xbfの一部を入力します。 MacとLinuxのブラウザでさえそれを尊重している。ですから、いくつかの場所では代わりにWindows-1252を使用します。 –

6

あなたはStringを持っている場合は、あなたがそれを行うことができます。

String s = "test"; 
try { 
    s.getBytes("UTF-8"); 
} catch(UnsupportedEncodingException uee) { 
    uee.printStackTrace(); 
} 

あなたは「壊れた」Stringを持っている場合は、別のエンコーディングでStringString変換、何か間違ったことをしたdefenetely方法ではありません行く! Stringbyte[]に、またはその逆(エンコードを指定)に変換できます。 Java StringではAFAIKがUTF-16でエンコードされていますが、それは実装の詳細です。

InputStreamReader isr; 
try { 
    isr = new InputStreamReader(inputStream, encoding); 
} catch(UnsupportedEncodingException uee) { 
    uee.printStackTrace(); 
} 
+1

InputStreamをお持ちの場合は、それをInputStreamReaderでラップする必要があります。 – erickson

3

は、文字列の出力を持つ簡単な方法は、(私はこれを行うためのメソッドを作成した)である:

私のために働いた
public static String (String input){ 
    String output = ""; 
    try { 
     /* From ISO-8859-1 to UTF-8 */ 
     output = new String(input.getBytes("ISO-8859-1"), "UTF-8"); 
     /* From UTF-8 to ISO-8859-1 */ 
     output = new String(input.getBytes("UTF-8"), "ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    return output; 
} 
// Example 
input = "Música"; 
output = "Música"; 
4

(「üzümbağları」正しいが書き込まれますトルコ語)UTF-8から

変換ISO-8859-1:

String encodedWithISO88591 = "üzüm baÄları"; 
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8"); 
//Result, decodedToUTF8 --> "üzüm bağları" 

変換のUTF-8 ISO-8859-1に

String encodedWithUTF8 = "üzüm bağları"; 
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1"); 
//Result, decodedToISO88591 --> "üzüm baÄları" 
+0

'String a = new String(encodedWithUTF8.getBytes(" ISO88591 ")、" ISO-8859-1 ")'および 'String b = new String(encodedWithUTF8.getBytes(" ISO88591 ")、" UTF-8 ")'?文字列が1つのエンコーディングに含まれていて、他のバイトを使用してバイトを取得した場合、何が起こっているのでしょうか? – parsecer

+0

IDEで結果を試してみることができます。このURLに従うと、http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte []) 、%20java.nio.charset.Charset)メソッド定義が表示されます。私はプロセスの正確な内容を知らない。 – webmaster

+1

誰かがこれを必要とするならば、私は上記のコマンドは次のようになると思います: 'a'は' UTF-8'のバイトを 'ISO'バイトに変換し、' bytes-> chars'の 'ストリングを印刷するためのISOエンコーディング。文字列 'b'の場合は、' UTF-8 'の 'bytes-> chars'テーブルを使用し、' UTF'ルールに従ってessencially 'ISO'バイトをマッピングします。 'a'は' ISO'であってもOKです。なぜなら、Javaはバイトの内部格納を混乱させないからです。 'ISO'の文字の一部が' UTF'エンコーディングのように出力されるため、 'b'が壊れる可能性があります。 – parsecer

0

のApache CommonsのIO Charsets classが便利になることができます。

String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array()) 
関連する問題