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
和ö
。
按照惯例和POSIX 定义,一个字节是八位。位是二进制数字(即基本数字1
或0
几乎所有数字计算的基础)。
字符通常是一个字节,并且在某些上下文中(例如 ASCII)可以定义为一个字节的长度。然而,Unicode、UTF-8 和 UTF-16 定义了扩展字符集,其中单个字符(或字形)可以由长度超过一个字节的数据有效负载定义。
\n单个字符:
\n\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
是单个字符,但它是通过将多个重音符号(或变音符号)应用于基本字形(简单的Q
. 这种编码的字节数比长度多得多:仅将该字符放入文件中并使用hexdump
而不是cat
在我的区域设置上显示内容会产生:
$ 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