2012-02-25 129 views
4

下面這個簡單的測試失敗:字符串UTF8編碼問題

assertEquals(myStringComingFromTheDB, "£"); 

,並提供:

Expected :£ 
Actual :£ 

我不明白爲什麼會這樣,特別是考慮到是實際字符串的編碼(指定爲第二個參數的那個)是錯誤的。該java文件保存爲UTF8。

下面的代碼:

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

輸出:

C2A3 
C382C2A3 

任何人都可以解釋我爲什麼?

謝謝。

更新:我在Windows 7

更新2的工作:它不涉及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: 用十六進制編輯器打開java文件,井號正確保存爲「C2A3」。

回答

2

請注意:assertEquals接受以下命令參數:

assertEquals(expected, actual) 

所以從DB降臨到你的情況下字符串是好的,但是從你的Java類中的一個不是(因爲你注意到的話)。 我想你是從某處複製了£ - 可能還有一些你的編輯器(IDE)不打印出來的奇怪字符(幾乎可以肯定)。我幾次遇到類似的問題,特別是當我在MS Windows上工作時:例如ctrl + c & ctrl + v從網站到IDE。

(我印我的UTF8編碼系統的£字節,這是C2A3):

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

其他的解決方案可能是您的文件是不是真的UTF8編碼。你在Windows或其他操作系統上工作嗎?

根據問題的編輯其他一些可能的解決方案:

1)它可能是IDE使用一些其他編碼。對於Eclipse看到這個線程:http://www.eclipse.org/forums/index.php?t=msg&goto=543800&

2)如果兩個IDE設置和最終文件的編碼都行,比它的編譯器的問題。請參閱: Java compiler platform file encoding problem

+0

謝謝您的回答,@PiotrekDe。我以爲ctrl + c和ctrl + v是一樣的,但我用鍵盤手動輸入,但仍然面臨問題。我正在使用Windows 7.這個問題很奇怪,它嚇壞了我! – satoshi 2012-02-25 15:43:03

+0

所以也許你的文件不是真正的UTF8編碼?你使用一些IDE嗎?如果是Eclipse,則可以從Windows>首選項>常規>內容類型)爲新文件設置默認編碼。看到這個線程:http://www.eclipse.org/forums/index.php?t=msg&goto=543800& – 2012-02-25 15:47:16

+0

我在IntelliJ IDEA的工作,編碼是UTF8。我已經檢查過這些選項,它是UTF8。此外,它寫在底部欄,當我選擇英鎊英鎊符號它說:「編碼(自動檢測):UTF-8」。 – satoshi 2012-02-25 15:51:01