这是一个古老的问题,但它仍然有效,我认为除了现有答案所涵盖的主题之外,还有更多有用但简要的说明。
Unicode
Unicode 定义properties for characters。
其中一个属性是“General Category”,它具有主要类和子类。主要类别是字母、标记、标点符号、符号、分隔符和其他。
通过了解角色的属性,您可以决定是否认为它们可在您的特定环境中打印。
您必须始终记住,“字符”和“可打印”之类的术语通常很困难,并且有一些有趣的极端情况。
编程语言支持
一些编程语言可以帮助解决这个问题。
例如,Go 语言有一个“unicode”包,它提供了许多有用的与 Unicode 相关的功能,包括这两个:
func IsGraphic(r rune) bool
IsGraphic reports whether the rune is defined as a Graphic by Unicode. Such
characters include letters, marks, numbers, punctuation, symbols, and spaces,
from categories L, M, N, P, S, Zs.
func IsPrint(r rune) bool
IsPrint reports whether the rune is defined as printable by Go. Such
characters include letters, marks, numbers, punctuation, symbols, and
the ASCII space character, from categories L, M, N, P, S and the ASCII
space character. This categorization is the same as IsGraphic except
that the only spacing character is ASCII space, U+0020.
请注意,它说的是“由 Go 定义为可打印”,而不是“由 Unicode 定义为可打印”。就好像 Unicode 的巫师们有一些不敢深究的深度。
可打印
您对 Unicode 了解得越多,就越能意识到人类书写系统的多样性和不可思议的怪异程度。
尤其是特定的“字符”是否可打印并不总是显而易见的。
可以打印零宽度空间吗?什么时候可以打印断字点?是否有字符的可打印性取决于它们在单词中的位置或与它们相邻的字符?组合字符总是可打印的吗?
脚注
ASCII 可打印字符范围为 \u0020 - \u007f
不,不是。 \u007f 是 DEL,通常不被视为可打印字符。例如,它与标有“DEL”的键盘键相关联,该键最早的用途是命令从某种介质(显示器、文件等)中删除字符。
事实上,许多 8 位字符集有许多不可打印的非连续范围。参见例如 C0 和 C1 控件。