UTF-16是一个两字节的字符编码.交换两个字节的地址将产生UTF-16BE和UTF-16 the。
但是我发现在Ubuntu gedit文本编辑器以及UTF-16BE和UTF-16LE中都存在UTF-16编码。用一个C测试程序,我发现我的计算机是小endian,并且UTF-16被确认为UTF-16 as的相同编码。
还:在小/大终端计算机中有两个值的字节顺序(例如整数)。小型endian计算机将在硬件中生成很少的endian值( Java生成的值除外,Java总是形成一个大endian)。
虽然在我的小终端计算机中文本可以保存为UTF-16 be和UTF-16 be,但字符是否是一个字节(例如ASCII字符串、引用3和UTF-16的endianness仅由人类定义) --而不是因为大端机器编写大端UTF-16而小endian机器编写小endian UTF-16的现象?
发布于 2016-04-11 13:46:48
“UTF-16的终端是计算机的endianness吗?”
您的计算机的盲目性的影响可以从作者或文件的读者的角度来看待。
如果您正在以标准格式读取文件,那么机器读取的类型应该无关紧要。格式应该有足够的定义,无论读写机的功能是什么,数据还是可以正确读取的。
这并不意味着格式不能灵活。对于"UTF-16“(当格式名称中不使用" be”或"LE“消歧),该定义允许将文件标记为大端或小端点。这是通过文件前两个字节中的“”(BOM)来完成的:
BOM的存在为文件编写者提供了选项。他们可能会选择为内存中的缓冲区写出最自然的endianness,并包含匹配的BOM。对于其他读者来说,这不一定是最有效的格式。但是任何声称UTF-16支持的程序都应该能够以任何方式处理它。
所以是的--计算机的endianness可能会考虑到BOM标记的UTF-16文件的endianness选择。尽管如此.一个小终端程序完全能够保存一个文件,标记为"UTF-16“,并使它成为大端程序。只要BOM与数据一致,不管是哪种机器写入或读取它。
...what如果没有BOM?
这就是事情变得有点模糊的地方。
一方面,Unicode RFC 2781和Unicode常见问题很清楚。他们说,以"UTF-16“格式开头的文件,无论是0xFF 0xFE还是0xFE 0xFF,都是解释为大端。
默认情况下,未标记的窗体使用大端字节序列化,但在开始时可能包括一个字节顺序标记,以指示实际使用的字节序列化。
然而,要知道是否有UTF-16-LE,UTF-16-BE,或UTF-16文件,没有BOM...you,需要元数据以外的文件告诉你,它是哪三个。因为不总是有存放数据的地方,所以有些程序最终使用了启发式方法。
考虑一下像陈雷蒙德(2007)这样的东西
您可能会决定,生成UTF-16文件而没有BOM的程序被破坏了,但这并不意味着它们不存在。例如, cmd /u /c dir >results.txt 这会生成一个没有BOM的UTF-16 BOM文件。
这是一个有效的UTF-16 be文件,但是“UTF-16 be”元标签会存储在哪里呢?有人把它称为UTF-16文件的可能性有多大?
从经验上看,这个词是有警告的。维基百科的UTF-16页说:
如果BOM丢失,RFC 2781表示应该假定大端编码.(实际上,由于Windows默认使用小终端顺序,许多应用程序在默认情况下类似地采用小endian编码。)
unicode.readthedocs.org说:
" UTF-16“和" UTF-32”编码名称不精确:根据上下文、格式或协议,UTF-16和UTF-32的BOM标记,或UTF-16和UTF-32在没有BOM的宿主endian中。在Windows上,"UTF-16“通常指UTF-16-LE.
而且,字节顺序-标记维基百科文章说:
Unicode标准的一致性子句D98 (第3.10节)规定:“UTF-16编码方案可以也可以不以BOM开头。但是,当没有BOM时,在没有更高级别协议的情况下,UTF-16编码方案的字节顺序是大端的。” 一个更高层次的协议是否有效是开放的解释。例如,本机字节排序较少的计算机本地文件可能被认为是隐式编码为UTF-16LE。因此,大端推定被人们普遍忽视. 另一方面,当这些文件可以在因特网上访问时,就不能作出这样的推定。搜索ASCII范围内的16位字符或仅搜索空间字符(U+0020)是确定UTF-16字节顺序的一种方法。
因此,尽管标准是明确的,但实际情况可能很重要。
正如@rici所指出的,这个标准已经存在了一段时间了。尽管如此,它还是可以对声称是"UTF-16“的文件进行二次检查。甚至考虑一下你是否想避免这些问题,接受UTF-8.
发布于 2016-04-11 15:53:47
Unicode标准第3.10节定义了Unicode编码方案。该标准定义了七种编码方案:
在16位和32位编码的情况下,这三个变体在endianness上不同,这可能是显式的,也可以通过使用字节顺序标记 (BOM)字符U+FEFF来表示:
LE变体绝对是小字节;低阶字节是首先编码的.不允许BOM,因此初始字符U+FEFF是零宽度无中断空间.BE变体绝对是大端字节;高阶字节是首先编码的.与LE变体一样,不允许BOM,因此初始字符U+FEFF是零宽度无中断空间。如果要对数据序列化使用16位或32位编码方案,通常建议使用带有显式BOM的未标记变体。然而,UTF-8是一种更为常见的数据交换格式.
虽然UTF-8不需要endian标记,但允许(但不建议)使用BOM启动UTF-8编码字符串;这可用于区分Unicode编码方案。许多Windows程序都是这样做的,在UTF-8传输开始时的U+FEFF可能应该被视为BOM (因此不应该作为Unicode数据)。
发布于 2016-04-11 13:32:43
不是的。难道你没有看到小终端电脑一直从互联网上接收数据包,这就是大端?
编码取决于您如何写入内存,而不是您的体系结构如何。
https://stackoverflow.com/questions/36550038
复制相似问题