java,utf8,国际字符和字节解释

use*_*515 1 java unicode encoding utf-8

我有一个String,可以输入我的程序.

4个字母A,O,"带有变音符号的E",L

"带有变音符号的E"的十六进制代码是0xc38b.查看UTF-8编码表和Unicode字符并查找"带有DIAERESIS的LATIN CAPITAL LETTER E"

然后它变得奇怪

我的java代码不是打印"E with a mumlaut",而是"A with a~"后跟0x8b

当我将字符串转换为字节数组并将其打印为十六进制时,我的4个字符串变为7个字符:

byte[0]=41 "A"
byte[1]=4f "O"
byte[2]=c3 c383 is "A with a ~" (per above link)
byte[3]=83
byte[4]=c2 c28b is some kind of control character (per above link)
byte[5]=8b
byte[6]=4c "L"
Run Code Online (Sandbox Code Playgroud)

我通过Charset.defaultCharset()验证了我的编码是UTF-8

它看起来几乎不正确地解释字节,但这怎么可能?

任何人都可以解释为什么这个字符串的字节解释被搞砸了,以及我如何纠正它?

eri*_*son 5

在线的某处,您的输入使用UTF-8编码,然后使用ISO 8859-1(或类似的单字节编码)进行解码.此时字符串已损坏.

"Ë"使用UTF-8 编码会产生字节[ 0xC3 0x8B ].使用ISO 8859-1对此进行解码会产生损坏的字符串"Ë"("\u00C3\u008B").使用UTF-8重新编码该字符串会产生原始问题的字节序列,[ 0xC3 0x83 0xC2 0x8B ]

确定ISO 8859-1被错误地用于解码UTF-8数据的位置,并指定UTF-8.

这是解码Web请求或响应时的常见问题.标准将ISO 8859-1指定为字符编码,除非明确覆盖,因此框架作为默认值回退到此.