2009-03-11 10 views
5

UTF-8の商標記号をISO Latin 1に変換し、ISO Latin 1でエンコードされたデータベースに保存する必要があります。UTF-8文字をISO Latin 1に変換する方法は?

どうすればjavaで行うことができますか?

私は

String s2 = new String(s1.getBytes("ISO-8859-1"), "utf-8"); 

のようなものを試してみたが、私が期待通りに動作しないようです。

+0

http://stackoverflow.com/questions/285228/how-to-convert-utf-8-to-us-ascii-in-java 正確には重複していませんが、類似しています。 –

答えて

5

Javaの文字列は、常にUnicode(UTF-16、効果的)です。変換は、テキストからバイナリエンコーディングに移動しようとする場合、またはその逆の場合にのみ必要です。

文字は何ですか?あなたはISO Latin 1にも存在していると確信していますか?そうであれば、私はそのキャラクターがあなたのデータベースに何の問題もなく保存されることを期待しています。 「UTF-8商標記号」はありません。あなたは "UTF-8の商標記号を表すバイト"を持つことができますが、これは文字列ではなくバイト配列になります。

編集:Unicode trademark character U + 2122を意味する場合は、ISO-Latin-1の範囲外です。 (IIRC、外観や法的な意味でのいずれか)と同じものではありませんが、何もないよりはましかもしれregistered trademark character U + 00AEは、あります - あなたはそれを使用したい場合だけ使用します。

string replaced = original.replace('\u2122', '\u00ae'); 
+2

しかし、<®>と<™>の意味は全く異なります。 –

+0

したがって、「同じものではありません(外観または法的意味のいずれか」 –

2
  1. Jon Skeetがあなたに言ったことを読んでください。あなたが投稿したコードはごみです(UTF-8でエンコードされた文字列がISO-8859-1のように解釈されますが、これは何も役に立ちません)。
  2. ISO-8859-1エンコーディング(a.k.a Latin1)には、商標文字「™」は含まれていません。
0

私は同様の問題を抱えており、エンティティの変換不可能な文字を変換することで解決しました。 情報を後でhtmlとして表示すると、とにかく問題ありません。

そうでない場合は、それらをユニコードに変換しようとする可能性があります。 「商標」とのpythonで

例:

s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace') 
# s is 'yellow bananas&#8482;' 
4

私の知る限り、あなただけのISO-をサポートしてDBに非Latin-1の文字が含まれている(s1から)文字を格納しようとしている理解して8859-1。

  • まず、私はそれが汚いアイデアだと言うことに同意します。 CP1252はISO-8859-1(文字あたり1バイト)から近く、あなたの質問をanwserし、今

  • ™が含まれて、私はあなたが反対のことをしたと思うこと
    注意..
    あなたがエンコードしたいですISO-8859-1にUTF-8バイト:

    String s2 = new String(s1.getBytes("UTF-8"), "ISO-8859-1"); 
    

    この方法では、s2は一度ISO-8859-1でエンコードされた、ということcharacher文字列で、有効なUTF-8のように見えるかもしれバイト配列を返します。バイト。元の文字列を取得するに

    、あなたは

    String s1 = new String(s2.getBytes("ISO-8859-1"),"UTF-8"); 
    

を行うしかし、待ってます!この場合、希望は、ISO-8859-1 .. で任意のバイトをデコードでき、DBはそのようなデータを受け入れることを願っています。

実際には、正式には、ISO-8859-1 doesn't have chars for any byte valuesのため実際には分かりません。 たとえば、80〜9Fです。

そして、

byte[] b = { -97, -100, -128 }; 
System.out.println(new String(b,"ISO-8859-1")); 

しかし、ジャワ、s.getBytes("ISO-8859-1")が実際に初期のアレイを復元???

を表示するであろう。

+1

偉大な答えは、文字セットの理解が優れています – paj28

関連する問題