2012-02-25 38 views
4

以下の簡単なテスト失敗している:文字列UTF8エンコードの問題

与える
assertEquals(myStringComingFromTheDB, "£"); 

Expected :£ 
Actual :£ 

をなぜこれが起こっている私は特にそれが実際の文字列のエンコーディングで考えると、理解していません(2番目の引数として指定されたもの)が間違っています。 JavaファイルはUTF8として保存されます。

次のコード:

System.out.println(bytesToHex(myStringComingFromTheDB.getBytes())); 
System.out.println(bytesToHex("£".getBytes())); 

出力:

C2A3 
C382C2A3 

誰が、なぜ私を説明できますか?

ありがとうございます。

アップデート:私は更新2 Windows 7の下

を働いている:それはJUnitと、次の簡単な例に関連していない:

byte[] bytes = "£".getBytes(); 
for(byte b : bytes) 
{ 
    System.out.println(Integer.toHexString(b)); 
} 

出力:

ffffffc3 
ffffff82 
ffffffc2 
ffffffa3 

更新3: 私はIntelliJ Ideaで作業しています。すでにオプションをチェックしており、エンコーディングはUTF8です。また、下のバーに書かれています。ポンド記号を選択して右クリックすると、「エンコード(自動検出):UTF-8」と表示されます。

更新4: 16進エディタでjavaファイルを開き、ポンド記号が正しく「C2A3」として保存されます。

assertEquals(expected, actual) 

ので、あなたの場合にはDBからの文字列はOKですが、(あなたはすでに気づいて)Javaクラスからの1ではありません。

答えて

2

assertEqualsは、次の順序でパラメータを受け入れることに注意してください。 私はどこかから£をコピーしたと思います。おそらくあなたのエディタ(IDE)が印刷しない(殆ど確実な)奇妙な文字があるかもしれません。何度か同じような問題がありました。特にMS Windowsで作業していました。 ctrl + c &ウェブサイトからIDEへのctrl + v。

(私はUTF8エンコードで私のシステムで£のバイトを印刷し、これはC2A3です):

for (byte b: "£".getBytes()) { 
    System.out.println(Integer.toHexString(b)); 
} 

他のソリューションは、あなたのファイルが本当にUTF8エンコードされていないということかもしれません。 Windowsや他のOSで作業していますか?質問に応じ

他のいくつかの可能な解決策は、編集:

1)には、IDEは、いくつかの他のエンコーディングを使用している可能性があります。Eclipseの場合:http://www.eclipse.org/forums/index.php?t=msg&goto=543800&

2)IDEの設定と最終的なファイルのエンコーディングが両方ともOKの場合は、コンパイラの問題です。参照: Java compiler platform file encoding problem

+0

ありがとうございます、@PiotrekDe。私はctrl + c&ctrl + vについても同じことを考えましたが、私はキーボードで手動で入力しましたが、私はまだ問題に直面しています。私はWindows 7を使用しています。この問題は大変奇妙で、それは私を驚かせています! – satoshi

+0

あなたのファイルは本当にUTF8でエンコードされていませんか?いくつかのIDEで作業しますか? Eclipseの場合は、Windows>環境設定>一般>コンテンツタイプから新しいファイルのデフォルトエンコードを設定できます。このスレッドを参照してください:http://www.eclipse.org/forums/index.php?t=msg&goto=543800& –

+0

私はIntelliJ Ideaで作業しています。エンコーディングはUTF8です。私はすでにオプションをチェックしており、それはUTF8です。また、下のバーに書かれています。ポンド記号を選択すると、「エンコード(自動検出):UTF-8」と表示されます。 – satoshi