有一个不可见的字符破坏了我的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
我们知道那个序列是什么吗?
答案 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;它就像一个魅力。