首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UTF-16,UTF-16 16,UTF-16 16中,UTF-16的末端是计算机的功能吗?

在UTF-16,UTF-16 16,UTF-16 16中,UTF-16的末端是计算机的功能吗?
EN

Stack Overflow用户
提问于 2016-04-11 13:24:17
回答 3查看 27.5K关注 0票数 12

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的现象?

  1. http://www.ibm.com/developerworks/aix/library/au-endianc/
  2. endian.html
  3. ASCII字符串和endianness
  4. endianness只影响数字的内存布局,而不影响字符串的布局,这是真的吗?这是字符串与机器之间关系的一个帖子.
EN

回答 3

Stack Overflow用户

发布于 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.

“UTF-16是否应被视为有害?”

票数 17
EN

Stack Overflow用户

发布于 2016-04-11 15:53:47

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

  • 8位: UTF-8
  • 16位: UTF-16 16,UTF-16 16和UTF-16
  • 32位: UTF-32 32,UTF-32 32和UTF-32

在16位和32位编码的情况下,这三个变体在endianness上不同,这可能是显式的,也可以通过使用字节顺序标记 (BOM)字符U+FEFF来表示:

  • LE变体绝对是小字节;低阶字节是首先编码的.不允许BOM,因此初始字符U+FEFF是零宽度无中断空间.
  • BE变体绝对是大端字节;高阶字节是首先编码的.与LE变体一样,不允许BOM,因此初始字符U+FEFF是零宽度无中断空间。
  • 没有endian标记的变体可能是大的,也可能是小的。通常,它将从BOM开始,BOM定义了endianness。如果没有BOM,则假定大端编码.

如果要对数据序列化使用16位或32位编码方案,通常建议使用带有显式BOM的未标记变体。然而,UTF-8是一种更为常见的数据交换格式.

虽然UTF-8不需要endian标记,但允许(但不建议)使用BOM启动UTF-8编码字符串;这可用于区分Unicode编码方案。许多Windows程序都是这样做的,在UTF-8传输开始时的U+FEFF可能应该被视为BOM (因此不应该作为Unicode数据)。

票数 3
EN

Stack Overflow用户

发布于 2016-04-11 13:32:43

不是的。难道你没有看到小终端电脑一直从互联网上接收数据包,这就是大端?

编码取决于您如何写入内存,而不是您的体系结构如何。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36550038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档