2012-04-11 14 views
3

私は、メッセージ・ブローカー(ストンプ)を介して、この文字列を取得しています:エンコードされた文字列を間違って修正する方法はありますか?

João 

、それはそれがためにsuposed方法は次のとおりです。

João 

は、Javaでこれを元に戻す方法はあります! ありがとう!

+1

? –

+1

http://stackoverflow.com/questions/2622911/fix-string-encoding-in-java – user219882

+0

メッセージブローカー(アクティブなmq)を参照してください...私はコードの反対側に触れることができないということです。私はこの文字列を修正する必要があります... – joaoricardo000

答えて

4
U+00C3 Ã c3 83 LATIN CAPITAL LETTER A WITH TILDE 
U+00C2 Â c3 82 LATIN CAPITAL LETTER A WITH CIRCUMFLEX 
U+00A3 £ c2 a3 POUND SIGN 
U+00E3 ã c3 a3 LATIN SMALL LETTER A WITH TILDE 

これがデータ(エンコード)変換の問題の原因となるかどうか判断できません。データが悪いことは可能でしょうか?

データが悪いわけではないならば、我々はあなたがエンコーディングを誤解していると仮定しなければなりません。元のエンコーディングはわかりません。別のことをしない限り、JavaのデフォルトのエンコーディングはUTF-16です。どのように一般的なエンコーディングで符号化されたJoãoがUTF-16でJoãoと解釈されるのかわかりません

確かに、私はこのpythonスクリプトを何も見当たりませんでした。私はそれがすべてのエンコーディングをカバーしたり、私はコーナーケース、FWIWが欠落していないよ完全わかりません。

#!/usr/bin/env python                             
# -- coding: utf-8 --                             
import pkgutil 
import encodings 

good = u'João' 
bad = u'João' 

false_positives = set(["aliases"]) 

found = set(name for imp, name, ispkg in pkgutil.iter_modules(encodings.__path__) if not ispkg) 
found.difference_update(false_positives) 
print found 


for x in found: 
    for y in found: 
     res = None 
     try: 
      res = good.encode(x).decode(y) 
      print res,x,y 
     except: 
      pass 
     if not res is None: 
      if res == bad: 
       print "FOUND" 
       exit(1) 
+0

答えをありがとう、私はあなたeffractに感謝します。とにかくコードの反対側を変更する必要があります。私はちょうどheheをしないための簡単な道があるかどうかを考え出していた – joaoricardo000

2

場合によってはハックが機能します。しかし、これが起こるのを防ぐのが最善です。

私は正しくページ上の正しいヘッダとHTTPコンテンツの種類とエンコーディングを印刷しますが、IEはなく、正しいのはlatin1でエンコードされたフォームを提出するサーブレットを持っていたとき前にこの問題を抱えていました。だから私はうまく働いた新しいデータのためにそれを修正する(検出し、それが実際にIEであれば変換し、要求ラッパーを含む)迅速な汚いハックを作成しました。また、データベースのデータがすでに乱雑になっているため、私は以下のハックを使用しました。

残念ながら(壊れた文字列を再現し、私の「理論的な原因」に比べてあなたの壊れた文字列の中だけで余分A)私のハックはあなたの例の文字列のために完璧に動作しませんが、それは非常に近いが見えます。だからおそらく私の "latin1"の推測は間違っているので、あなたは他のものを試してみるべきです(Tomasが投稿した他のリンクなど)。

package peter.test; 

import java.io.UnsupportedEncodingException; 

/** 
* User: peter 
* Date: 2012-04-12 
* Time: 11:02 AM 
*/ 
public class TestEncoding { 
    public static void main(String args[]) throws UnsupportedEncodingException { 
     //In some cases a hack works. But best is to prevent it from ever happening. 
     String good = "João"; 
     String bad = "João"; 

     //this line demonstrates what the "broken" string should look like if it is reversible. 
     String broken = breakString(good, bad); 

     //here we show that it is fixable if broken like breakString() does it. 
     fixString(good, broken); 

     //this line attempts to fix the string, but it is not fixable unless broken in the same way as breakString() 
     fixString(good, bad); 
    } 

    private static String fixString(String good, String bad) throws UnsupportedEncodingException { 
     byte[] bytes = bad.getBytes("latin1"); //read the Java bytes as if they were latin1 (if this works, it should result in the same number of bytes as java characters; if using UTF8, it would be more bytes) 
     String fixed = new String(bytes, "UTF8"); //take the raw bytes, and try to convert them to a string as if they were UTF8 

     System.out.println("Good: " + good); 
     System.out.println("Bad: " + bad); 
     System.out.println("bytes1.length: " + bytes.length); 
     System.out.println("fixed: " + fixed); 
     System.out.println(); 

     return fixed; 
    } 

    private static String breakString(String good, String bad) throws UnsupportedEncodingException { 
     byte[] bytes = good.getBytes("UTF8"); 
     String broken = new String(bytes, "latin1"); 

     System.out.println("Good: " + good); 
     System.out.println("Bad: " + bad); 
     System.out.println("bytes1.length: " + bytes.length); 
     System.out.println("broken: " + broken); 
     System.out.println(); 

     return broken; 
    } 
} 

そして(SunのJDK 1.7.0_03での)結果:ブローカーは何ですか

Good: João 
Bad: João 
bytes1.length: 5 
broken: João 

Good: João 
Bad: João 
bytes1.length: 5 
fixed: João 

Good: João 
Bad: João 
bytes1.length: 6 
fixed: Jo�£o 
関連する問題