2011-08-17 42 views
2

有一個不可見的字符會破壞我的XML解析器。查看Unicode字符串的八進制編碼(瀏覽器內或OSX工具)

c&

的XML聲稱是UTF-8,但是當我嘗試使用<c:import . . . charEncoding="UTF-8">

我得到這個友好的信息:

ERROR: javax.servlet.jsp.JspException: java.io.CharConversionException: illegal utf8 encoding at (187)

我已經能夠找到源的問題。它是位於'c'和'&'之間的隱形字符。

我想知道更多關於這個角色的信息,但是似乎IntelliJ無法讓我看到隱藏的角色。 。 。

我想我看到一個在線工具可以將Unicode字符轉換爲它們的八進制值,但我無法再找到它。如果有我需要下載的工具,那很好。

有什麼建議嗎?


確定一個朋友告訴我od,所以我給一個嘗試:

$ echo -n "c&" | od -c 
0000000 c 357 273 277 357 273 277 &         
0000010 

如此看來問題是由字節序列357 273 277

難道因爲我們知道這是什麼序列是什麼?

+0

爲什麼八進制而不是十六進制?只是好奇心,雖然我的第一步分析將轉換八進制到十六進制。 –

+0

我試過十六進制,但它將字節組合成對並且很難理解。我從來沒有做過這樣的事情,並嘗試過所有可能的OD選項。 'c escape code'選項是最容易理解的,並且清楚地顯示了一種模式。 – jisaacstone

+0

我同意'od -x'不是有用的格式。早在1988年,我寫了一個'odx'(十六進制的八進制轉儲,或'od -x done right')程序,它可以逐字節地執行十六進制轉儲,有點像'od -c'。我仍然使用它。 –

回答

6

在下表中,點表示八進制數字之間的間隔,而破折號表示十六進制數字之間的間隔。

Octal:  3 5 7 | 2 7 3 | 2 7 7 
Binary: 11.10-1.111 | 10.11-1.011 | 10.11-1.111 
Hex:   E  F  | B  B | B  F 

這對於有效的UTF-8格式是正確的。第一個nybble顯示兩個連續字節,接下來的兩個字節確實是連續字節。第一個字節的第二個字節,以及接下來兩個字節中每個字節的最後6個位形成Unicode字符的數據。

Unicode Binary: 1111 1110 11.11 1111 
Unicode Hex:  F  E F F 

因此,文字是U + FEFF,這是BOM(字節順序標記)或ZWNBSP(零寬度不間斷空格)。以UTF-8編碼BOM是非常規的(不需要);對它們中的兩個連續編碼是非常傳統的;而且對於BOM不是UTF-8碼流中的第一個字符而言,這是非常傳統的。

查看Unicode FAQ on BOM瞭解更多信息。

1

找到了答案:這是byte-order-mark

Octal: 357  273  277 
Binary: 011101111 010111011 010111111 
Hex: 0xEF  0xBB  0xBF 

字節順序標記是有效的UTF-16,所以我試圖進口飼料爲UTF-16 &它的工作就像一個魅力。