为什么在UNIX / Linux环境交互时UTF-8编码使用?(Why is it that UTF

2019-09-02 06:04发布

我知道这是惯例,但为什么呢? 是否有真正的技术原因,任何其他方式将是一个非常糟糕的主意,或只是基于编码和向后兼容性的历史? 此外,什么是不使用的危险UTF-8但一些其他的编码(最值得注意的是, UTF-16 )?

编辑:通过互动,我大多指的是shelllibc

Answer 1:

一方面是因为文件系统预计NUL(“\ 0”)字节终止的文件名,所以UTF-16将无法正常工作。 你必须修改大量的代码进行改变。



Answer 2:

乔纳森 - 莱弗勒说来,主要问题是ASCII空字符。 Ç传统需要一个字符串为空终止。 因此,标准的C字符串功能将窒息含有相当于一个ASCII零(0x00)字节任何UTF-16字符。 虽然你当然可以用宽字符支持方案,UTF-16是不是在Unicode的一个合适的外部编码文件名,文本文件,环境变量 。

此外,UTF-16和UTF-32有两个大endian和little endian方向。 为了解决这个问题,你要么需要像一个MIME类型,或外部的元数据字节定位标识 。 它指出,

当UTF-8在8位环境中透明地使用,使用一个BOM将与预计在开始具体的ASCII字符,如使用的任何协议或文件格式干扰“#!” 在UNIX shell脚本的开始。

前身为UTF-16,这是所谓的UCS-2不支持代理对,有同样的问题 。 UCS-2应尽量避免。



Answer 3:

我相信这是主要的向后兼容性是UTF8与ASCII给。

对于一个问题的“危险”的问题,你需要指定你的“互动”的意思。 你的意思是与外壳进行交互,用的libc,或与内核是否正确?



Answer 4:

现代Unix系统使用UTF-8,但这并非总是如此。 在RHEL2 - 这是只有几年的历史 - 默认值是

  $区域  LANG = C  LC_CTYPE = “C”  LC_NUMERIC = “C”  LC_TIME = “C”  LC_COLLATE = “C”  LC_MONETARY = “C”  LC_MESSAGES = “C”  LC_PAPER = “C”  LC_NAME = “C”  LC_ADDRESS = “C”  LC_TELEPHONE = “C”  LC_MEASUREMENT = “C”  LC_IDENTIFICATION = “C”  LC_ALL = 
的C / POSIX语言环境预期是一个7位ASCII兼容编码。

然而,如乔纳森莱弗勒所述,任何编码其允许NUL字节内的字符序列是在Unix不可行,因为系统API是区域设置的无知; 串都假定为通过\ 0终止字节序列。



Answer 5:

我相信,当微软使用两个字节编码开始,上述0xFFFF的字符尚未分配的,所以使用两个字节编码意味着没有人不得不担心角色有不同的长度。

既然有此范围之外的字符,所以你总得去面对不同长度的人物,为什么会有人使用UTF-16? 我怀疑微软会做出不同的决定,如果他们今天被desigining他们的Unicode支持。



Answer 6:

是的,这是出于兼容性考虑。 UTF-8是ASCII码向后COMPTABLE。 的Linux / Unix是基于ASCII的,所以它只是制造/有道理。



Answer 7:

我认为7位ASCII的罚款。

严重的是,Unicode是在事物的方案相对较新,和UTF-8是向后兼容于ASCII和使用较少的空间(半)为典型的文件,因为它使用每个码点(字符)1到4个字节,而UTF-16的用途或者每个代码点(字符)2或4个字节。

UTF-16是优选的,因为较简单的宽度的内部程序的使用。 其前身UCS-2是为每一个代码点正好2个字节。



Answer 8:

我认为这是因为期望ASCII输入程序将无法处理的编码,如UTF-16。 对于大多数字符(在0-255范围内),这些方案将看到高字节作为一个NUL / 0焦炭,这在许多语言和系统中使用的标记字符串的结束。 这不以UTF-8,其目的是避免内嵌的NULL的和是字节顺序无关的发生。



文章来源: Why is it that UTF-8 encoding is used when interacting with a UNIX/Linux environment?