查看Unicode字符串的八进制编码(浏览器内或OSX工具)

时间:2011-08-17 18:44:14

标签: xml unicode utf-8 character-encoding

有一个不可见的字符破坏了我的XML解析器。

c&

XML声称是UTF-8,但是当我尝试使用<c:import . . . charEncoding="UTF-8">

我收到了这条友好的信息:

  

错误:javax.servlet.jsp.JspException:java.io.CharConversionException:非法的utf8编码(187)

我能够找到问题的根源。它是一个位于'c'和'&amp;'之间的隐形字符。

我想更多地了解这个角色,但似乎IntelliJ无法向我展示隐藏的角色。 。 。

我想我在网上看到了一个可以将Unicode字符转换为八进制值的工具,但我再也找不到了。如果有一个我需要下载的工具,那就没问题。

有什么建议吗?


好的朋友告诉我od所以我尝试了一下:

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

所以似乎问题是由字节序列357 273 277

引起的

我们知道那个序列是什么吗?

2 个答案:

答案 0 :(得分: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显示两个连续字节,接下来的两个字节确实是连续字节。第一个字节的第二个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 :(得分:1)

找到答案:那是byte-order-mark

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

字节顺序标记是有效的UTF-16,所以我尝试将Feed导入为UTF-16&amp;它就像一个魅力。