UTF-8可以包含BOM。但是,它 没有任何区别 字节流的字节顺序。 UTF-8 总是有相同的字节顺序。
如果Utf-8
将所有代码点存储在一个字节中,那么为什么字节顺序不起任何作用是有道理的,因此不需要BOM
。但由于代码点128及以上使用2,3和最多6个字节存储,这意味着它们在大端机器上的字节顺序与小端机器上的字节顺序不同,因此我们如何声称Utf-8
始终具有相同的字节顺序字节顺序?
谢谢
编辑:
UTF-8是面向字节的
我理解,如果两个字节UTF-8
字符C
由字节B1
和B2组成(其中B1
是第一个字节,B2
是最后一个字节)然后使用UTF-8
这两个字节总是以相同的顺序写入(因此,如果将此字符写入小端机LEM
上的文件,B1
将是第一个{{1}同样,如果将B2
写入大端机C
上的文件,BEM
仍然是第一个,而B1
仍然是最后一个。
但B2
将C
写入F
上的文件LEM
会发生什么情况,但我们会将F
复制到BEM
并尝试在那里阅读?由于BEM
会自动切换字节(B1
现在是最后一个而B2
是第一个字节),app(在BEM
上运行)阅读F
将如何知道F是否为在BEM
创建,因此没有交换两个字节的顺序或F
是否从LEM
传输,在这种情况下BEM
自动交换字节?
我希望问题有道理
编辑2:
回复你的编辑:big-endian 如果你问,机器不会交换字节 他们一次读一个字节。
a)哦,即使字符 C 是2个字节长,app(驻留在 BEM 上)读取 F 也会读入内存当时只有一个字节(因此它将首先读入内存 B1 ,然后 B2 )
b)
在UTF-8中,您决定如何处理 字节基于其高阶位
假设文件 F 有两个后续字符 C 和 C1 (其中 C 由字节组成B1 和 B2 ,而 C1 有字节 B3 , B4 和 B5 )。应用程序读取 F 如何通过检查每个字节的高位来知道哪些字节属于一起(例如,它将如何计算 B1 和 B2 < / em>一起代表一个角色而不是 B1 ,* B2 *和 B3 )?
如果你相信你正在看到 不同的东西,请编辑你的 问题和包括
我不是这么说的。我根本不明白发生了什么
c)为什么Utf-16和Utf-32也不是面向字节的?
答案 0 :(得分:30)
对于大于一个字节的字/整数,大端与小端机器的字节顺序不同。
e.g。在大端机器上,2字节的短整数存储第一个字节中的8个最高有效位,第二个字节中的8个最低有效位。在小端机器上,8个最高有效位将是第二个字节,即第一个字节中的8个最低有效位。
因此,如果将这种短int的内存内容直接写入文件/网络,则short int中的字节顺序将根据字节顺序而有所不同。
UTF-8是面向字节的,因此没有关于字节序的问题。无论字节顺序如何,第一个字节始终是第一个字节,第二个字节始终是第二个字节等。
答案 1 :(得分:10)
回答c):UTF-16和UTF-32将字符表示为16位或32位字,因此它们不是面向字节的。
对于UTF-8,最小单位是一个字节,因此它是面向字节的。算法一次读取或写入一个字节。在所有机器上以相同的方式表示字节。
对于UTF-16,最小单位是16位字,对于UTF-32,最小单位是32位字。该算法一次读取或写入一个字(2个字节或4个字节)。在big-endian和little-endian机器上,每个字的字节顺序是不同的。