ED A0 80 ED B0 80是一个有效的UTF-8字节序列吗?

Pac*_*ier 10 java language-agnostic unicode utf-8

java.nio.charset.Charset.forName("utf8").decode解码一个字节序列

 ED A0 80 ED B0 80
Run Code Online (Sandbox Code Playgroud)

进入Unicode代码点:

 U+10000
Run Code Online (Sandbox Code Playgroud)

java.nio.charset.Charset.forName("utf8").decode也解码一个字节序列

 F0 90 80 80
Run Code Online (Sandbox Code Playgroud)

进入Unicode代码点:

 U+10000
Run Code Online (Sandbox Code Playgroud)

这由以下代码验证.

现在这似乎告诉我UTF-8编码方案将解码ED A0 80 ED B0 80F0 90 80 80进入相同的unicode代码点.

但是,如果我访问https://www.google.com/search?query= %ED%A0%80%ED%B0%80,

我可以看到它是从页面明显不同https://www.google.com/search?query= %F0%90%80%80

由于谷歌搜索使用UTF-8编码方案(如果我错了,请纠正我),

这表明UTF-8不会解码ED A0 80 ED B0 80F0 90 80 80进入相同的unicode码点.

所以基本上我想知道,按照官方标准,UTF-8应该将ED A0 80 ED B0 80字节序列解码为Unicode码点U + 10000吗?

代码:

public class Test {

    public static void main(String args[]) {
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xED, (byte) 0xA0, (byte) 0x80, (byte) 0xED, (byte) 0xB0, (byte) 0x80 });
        java.nio.CharBuffer cb = java.nio.charset.Charset.forName("utf8").decode(bb);
        for (int x = 0, xx = cb.limit(); x < xx; ++x) {
            System.out.println(Integer.toHexString(cb.get(x)));
        }
        System.out.println();
        bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xF0, (byte) 0x90, (byte) 0x80, (byte) 0x80 });
        cb = java.nio.charset.Charset.forName("utf8").decode(bb);
        for (int x = 0, xx = cb.limit(); x < xx; ++x) {
            System.out.println(Integer.toHexString(cb.get(x)));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dan*_*n04 11

ED A0 80 ED B0 80是UTF-16代理对的UTF-8编码D800 DC00.这是不是在允许UTF-8 :

但是,D800和DFFF之间的UCS-2值对(Unicode术语中的代理对)...需要特殊处理:必须撤消UTF-16转换,产生UCS-4字符,然后如上所述进行转换.

然而,这样的编码在使用CESU-8和Java的"修饰的UTF-8".

由于谷歌搜索使用UTF-8编码方案(如果我错了,请纠正我),

基于搜索框,Google似乎正在使用某种编码自动检测功能.如果你传递它F0 90 80 80,它是有效的UTF-8,它会将其解释为UTF-8(). If you pass it ED A0 80 ED B0 80,这是无效的UTF-8,它会将其解释为windows-1252(í?€í°€).