字节和字符(至少 *nixwise)有什么区别?

var*_*der 4 character-encoding special-characters terminology escape-characters byte

我了解任何字符都由一个或多个字节组成。

如果我没记错的话,至少在 *nix 操作系统中,一个字符通常(或完全?)仅由一个字节组成。

字节和字符(至少 *nixwise)有什么区别?

ilk*_*chu 11

POSIXly,强调我的:

3.87 字符Character一个或多个字节的
序列,表示单个图形符号或控制代码。

实际上,确切的含义取决于有效的语言环境,例如在“C”语言环境下,printf '\xc3\xa4\xc3\xb6' |wc -m给出 4,因为它有效地计算字节数;而在给出 2 的 UTF-8 语言环境下,因为这是两个 UTF-8 编码字符äö。假设您的终端也设置为 UTF-8,您当然可以只写printf 'äö'.

(请注意,它wc -c被定义为计算字节数,而不是字符数,这很容易混淆。)

更糟糕的是,字符支持还取决于实用程序,并不是所有东西都能干净利落地处理多字节字符(更不用说 Unicode 的所有怪癖了)。例如 GNU tr 处理字节,不管它的手册页说的是什么:

$ printf ä | tr ä xy; echo
xx
$ printf ö | tr ä xy; echo
x?
Run Code Online (Sandbox Code Playgroud)

首先是一样的tr '\303\244' 'xy',所以两个字节的ä被替换,而第二是因为双方的第一个字节äö是一样的。当然,如果它真的处理字符,那些应该打印xö


Dop*_*oti 3

按照惯例和POSIX 定义,一个字节是八位。位是二进制数字(即基本数字10几乎所有数字计算的基础)。

\n

字符通常是一个字节,并且在某些上下文中(例如 ASCII)可以定义为一个字节的长度。然而,Unicode、UTF-8 和 UTF-16 定义了扩展字符集,其中单个字符(或字形)可以由长度超过一个字节的数据有效负载定义。

\n

单个字符:

\n
\n

Q\xcc\xb4\xcc\x91\xcc\x8d\xcc\x89\xcc\x86\xcc\x89\xcd\x9d\xcd\x9b\xcc\x91\xcc\x95\xcc\x82\xcc\xaa\xcc\x98\xcc\xb3\xcc\xa3\xcc\xa2\xcc\x9e\xcc\xa9\xcc\xaa

\n
\n

是单个字符,但它是通过将多个重音符号(或变音符号)应用于基本字形(简单的Q. 这种编码的字节数比长度多得多:仅将该字符放入文件中并使用hexdump而不是cat在我的区域设置上显示内容会产生:

\n
$ hexdump -C demo\n00000000  51 cc b4 cc 91 cc 8d cc  89 cc 86 cc 89 cd 9d cd  |Q...............|\n00000010  9b cc 91 cc 95 cc 82 cc  aa cc 98 cc b3 cc a3 cc  |................|\n00000020  a2 cc 9e cc a9 cc aa 0a                           |........|\n00000028\n
Run Code Online (Sandbox Code Playgroud)\n

  • “一个字节根据定义是八位”,谁的定义,从什么时候开始? (6认同)
  • _“根据定义,一个字节是八位。”_ - 根据[维基百科](https://en.wikipedia.org/wiki/Byte),现代系统上的字节是 8 位,但_根据定义_它们不是 8 位_ :_“字节的大小历来取决于硬件,并且不存在强制规定大小的明确标准。已使用 1 到 48 位的大小。[...] 8 位的现代事实上的标准... “_ (5认同)
  • 我会注意到:在*许多*上下文中,这里的 Zalgo 文本被认为是多个“字符”(实际上,多个代码点,“字符”是一个过于重载的术语)。它是一个单一的字素,由多个组合代码点组成。 (3认同)