是不是在大端机器上UTF-8的字节顺序不同于小端机器?那么为什么UTF-8不需要BOM?

use*_*291 32 unicode utf-8

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将是第一个也是B2最后一个.同样,如果C写入大端机器上的文件BEM,B1仍将是第一个B2仍然是最后一个).

但是,当发生了什么C写入到文件FLEM,但我们复制FBEM设法在那里读了吗?由于BEM自动交换字节(B1现在是最后B2一个字节和第一个字节),app(运行BEM)读取如何F知道是否创建了F BEM,因此没有交换两个字节的顺序或是否F从中转移LEM,在这种情况下BEM自动交换字节?

我希望问题有道理

编辑2:

响应您的编辑:如果要求大端机器一次读取一个字节,则不会交换字节.

a)哦,所以即使字符C是2个字节长,app(驻留在BEM上)读取F会在当时只读一个字节读入存储器(因此它将首先读入存储器B1,然后才读入B2)

b)

在UTF-8中,您可以根据高位来决定如何处理字节

假设文件F具有两个后续字符CC1(其中C由字节B1B2组成,而C1具有字节B3,B4B5).应用程序读取F如何通过检查每个字节的高位来知道哪些字节属于一起(例如,它如何计算出B1B2一起代表一个字符而不是B1,*B2*和B3)?

如果您认为自己看到了不同的内容,请编辑您的问题并加入

我不是那么说的.我根本不明白发生了什么

c)为什么Utf-16和Utf-32也不是面向字节的?

nos*_*nos 32

对于大于一个字节的字/整数,大端与小端机器的字节顺序不同.

例如,在大端机器上,2字节的短整数存储第一字节中的8个最高有效位,第二字节中的8个最低有效位.在小端机器上,8个最高有效位将是第二个字节,即第一个字节中的8个最低有效位.

因此,如果将这种短int的内存内容直接写入文件/网络,则short int中的字节顺序将根据字节顺序而有所不同.

UTF-8是面向字节的,因此没有关于字节序的问题.无论字节顺序如何,第一个字节始终是第一个字节,第二个字节始终是第二个字节等.

  • 处理字节时,BEM和LEM都不会交换任何字节.如果你读取超过1个字节作为更大的类型,例如2个字节作为短或4个字节作为int,那么它们将被交换然后你必须关心哪个字节在整数内 (5认同)
  • 字节不会"自动"交换.根据字节顺序,它们具有不同的含义(如果是较大整数的一部分),但没有交换. (2认同)

Cha*_*had 10

回答c):UTF-16和UTF-32将字符表示为16位或32位字,因此它们不是面向字节的.

对于UTF-8,最小单位是一个字节,因此它是面向字节的.算法一次读取或写入一个字节.在所有机器上以相同的方式表示字节.

对于UTF-16,最小单位是16位字,对于UTF-32,最小单位是32位字.该算法一次读取或写入一个字(2个字节或4个字节).在big-endian和little-endian机器上,每个字的字节顺序是不同的.

  • @starriet是的,涉及多个字节,但是UTF编码中**代码单元**的顺序不依赖于字节序,仅依赖于各个代码单元的值。在 UTF-8 中,每个单独的代码单元都是 1 个字节,因此它们的值不受字节序的限制。但在 UTF-16/UTF-32 中,每个单独的代码单元分别为 2/4 字节,因此它们的值受字节序限制。 (2认同)