Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在UTF-16中,UTF-16BE、UTF-16LE是计算机UTF-16的尾端;什么是持久性?_C_Unicode_Endianness_Utf 16 - Fatal编程技术网

C 在UTF-16中,UTF-16BE、UTF-16LE是计算机UTF-16的尾端;什么是持久性?

C 在UTF-16中,UTF-16BE、UTF-16LE是计算机UTF-16的尾端;什么是持久性?,c,unicode,endianness,utf-16,C,Unicode,Endianness,Utf 16,UTF-16是一种双字节字符编码。交换两个字节的地址将产生UTF-16BE和UTF-16LE 但是我发现UTF-16编码这个名字存在于Ubuntugedit文本编辑器中,以及UTF-16BE和UTF-16LE中。通过C测试程序,我发现我的计算机是little endian,UTF-16被确认为UTF-16LE的相同编码 另外:在小/大端计算机中,一个值(如整数)有两个字节顺序。Little-endian计算机将在硬件中产生Little-endian值(Java产生的值除外,Java总是形成一个大

UTF-16是一种双字节字符编码。交换两个字节的地址将产生UTF-16BE和UTF-16LE

但是我发现UTF-16编码这个名字存在于Ubuntu
gedit
文本编辑器中,以及UTF-16BE和UTF-16LE中。通过C测试程序,我发现我的计算机是little endian,UTF-16被确认为UTF-16LE的相同编码

另外:在小/大端计算机中,一个值(如整数)有两个字节顺序。Little-endian计算机将在硬件中产生Little-endian值(Java产生的值除外,Java总是形成一个大端值)

虽然文本可以在我的little endian计算机中保存为UTF-16LE和UTF-16BE,但字符是一个字节接一个字节生成的(例如ASCII字符串,参考[3])而人类刚刚定义的UTF-16的端性——不是因为大端机器写大端UTF-16而小端机器写小端UTF-16的现象

  • 这是一篇关于弦的端度和机器之间关系的文章

  • 不,你没看到小恩迪安计算机一直从互联网上接收数据包,这就是大恩迪安吗

    编码取决于写入内存的方式,而不是体系结构的方式。

    “UTF-16的endian是计算机的endian吗?”

    可以从文件的写入者或读取器的角度来看待计算机端性的影响

    如果您正在以标准格式读取文件,那么读取该文件的机器的类型应该无关紧要。格式应该足够明确,无论读取机器的尾端是什么,数据仍然可以正确读取

    这并不意味着格式不能灵活。使用“UTF-16”(当格式名称中未使用“be”或“LE”消歧时),定义允许将文件标记为大端或小端。这是通过文件前两个字节中的“字节顺序标记”(BOM)来完成的:

    BOM的存在为文件的编写者提供了选项。他们可能会选择为内存中的缓冲区编写最自然的结尾,并包含匹配的BOM。对于其他读取器来说,这不一定是最有效的格式。但任何声称支持UTF-16的程序都应该能够以任何方式处理它

    因此,是的——计算机的endianness可能会考虑到标记为UTF-16的BOM表文件的endianness选择。不过……一个小小的endian程序完全能够保存一个文件,将其标记为“UTF-16”并使其成为big-endian。只要BOM表与数据一致,不管是哪种机器写入或读取它

    …如果没有BOM怎么办?

    这就是事情变得有点模糊的地方

    一方面,Unicode和Unicode常见问题很清楚。他们说,一个“UTF-16”格式的文件,既不是以
    0xFF 0xFE
    开头,也不是以
    0xFE 0xFF
    开头,应该是:

    默认情况下,未标记表单使用big-endian字节序列化,但可以在开头包含字节顺序标记,以指示实际使用的字节序列化

    然而,要知道是否有没有BOM的UTF-16-LE、UTF-16-BE或UTF-16文件……您需要文件外部的元数据来告诉您这三个文件中的哪一个。因为不总是有放置这些数据的地方,一些程序最终使用了试探法

    考虑以下情况:

    您可能认为生成没有BOM表的UTF-16文件的程序已损坏,但这并不意味着它们不存在。例如

    cmd /u /c dir >results.txt
    
    这将生成一个不带BOM表的UTF-16LE文件

    这是一个有效的UTF-16LE文件,但“UTF-16LE”元标签将存储在哪里?有人通过称其为UTF-16文件而忽略它的可能性有多大

    根据经验,关于这个词有一些警告。维基百科说:

    如果缺少BOM,RFC2781表示应该采用大端编码(实际上,由于Windows默认使用小端顺序,许多应用程序默认采用小端编码)

    并说:

    “UTF-16”和“UTF-32”编码名称不精确:根据上下文、格式或协议的不同,它表示带有BOM标记的UTF-16和UTF-32,或主机端中没有BOM的UTF-16和UTF-32。在Windows上,“UTF-16”通常表示UTF-16-LE

    此外,报告还说:

    Unicode标准的一致性条款D98(第3.10节)规定,“UTF-16编码方案可能以BOM开头,也可能不以BOM开头。但是,如果没有BOM,并且没有更高级别的协议,UTF-16编码方案的字节顺序是big-endian。”

    高级协议是否有效有待解释。例如,对于本机字节顺序为little endian的计算机本地文件,可能会被认为隐式编码为UTF-16LE。因此,big endian的假设被广泛忽略

    当这些相同的文件可以在Internet上访问时,另一方面 另一方面,不能做出这样的假设。搜索16位字符 在ASCII范围内或仅空格字符(U+0020)是一种 确定UTF-16字节顺序

    因此,尽管标准明确无误,但在实践中,上下文可能很重要

    RICI指出,这个标准已经存在了一段时间。然而,对被称为“UTF-16”的文件进行双重检查还是值得的,或者甚至考虑是否要避免很多问题,并拥抱UTF-8……/P>

    标准第3.10节定义了Unicode编码方案。该标准定义了七种编码方案:

    • 8位:UTF-8
    • 16位:UTF-16BE、UTF-16LE和UTF-16
    • 32位:UTF-32BE、UTF-32LE和UTF-32
    在c