任何人都可以告诉我Unicode可打印字符的范围是什么? [例如。 Ascii可打印字符范围是\ u0020 - \ u007f]
答案 0 :(得分:18)
请参阅http://en.wikipedia.org/wiki/Unicode_control_characters
您可能希望特别注意C0和C1控制字符http://en.wikipedia.org/wiki/C0_and_C1_control_codes
维基说,C0控制字符在U + 0000-U + 001F和U + 007F(与ASCII相同的范围)范围内,C1控制字符在U + 0080-U + 009F范围内
除C控制字符外,Unicode还有数百个格式控制字符,例如零宽度非连接器,使字符间距更近,或双向文本控制。这种格式控制字符相当分散。
更重要的是,你在做什么需要你知道Unicode的不可打印字符?更有可能的是,无论你想做什么,都是解决问题的错误方法。
答案 1 :(得分:13)
首先,你应该在你的问题中删除“UTF8”这个词,它是不相关的(UTF8只是Unicode的编码之一,它与你的问题正交)。
第二:“打印/不可打印”的含义在Unicode中不太清楚。也许你的意思是“graphical character”;如果空间是可打印的/图形的,人们甚至可以提出异议。非图形字符基本上由控制字符组成:范围0x00-0x0f加上其他一些分散的字符。
无论如何,绝大多数Unicode字符(超过200.000)都是“图形”。但这当然并不意味着它们可以在您的环境中打印。
在我看来,如果您打算生成“随机可打印”的unicode字符串,尝试包含所有“可打印”字符,这似乎是一个坏主意。
答案 2 :(得分:6)
这是一个古老的问题,但它仍然有效,我认为关于该主题的有用但简短的发言要比现有答案涵盖的更多。
Unicode定义了properties for characters。
这些属性之一是“常规类别”,具有主要类和子类。主要类别是字母,标记,标点,符号,分隔符和其他。
通过了解字符的属性,您可以决定是否认为它们在特定情况下可打印 。
您必须始终记住,“字符”和“可打印”之类的词通常很困难,并且带有有趣的边缘情况。
某些编程语言可以解决此问题。
例如,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控件。
答案 3 :(得分:3)
您应该选择一种字体,然后生成一个列表,其中包含为您的字体定义的字形。您可以使用像freetype这样的字体库来测试字形(测试FT_Get_Char_Index(...)!= 0)。
答案 4 :(得分:0)
int数据类型中可打印的Unicode字符范围(不包括十六进制)为32至126。
答案 5 :(得分:0)
目前Unicode定义为从U+0000
开始到U+10FFFF
结束。第一个区块,基本拉丁语,跨越 U+0000
到 U+007F
,最后一个区块,Supplementary Private Use Area-B,跨越 {{1} } 到 U+100000
。如果您想查看所有这些块,请参见此处:Wikipedia.org: Unicode Block; List of Blocks。
让我们分解一下拉丁块 1 中的有效/无效内容。
如果您有兴趣过滤掉不可见的字符,您需要过滤掉:
10FFFF
到 U+0000
:控制U+0008
到 U+000E
:设备(即控制)U+001F
:删除(控制)U+007F
到 U+008D
:设备(即控制)这是拉丁语块,分成更小的部分...
U+009F
到 U+0000
:控制U+0008
到 U+0009
:空格U+000C
到 U+000E
:设备(即控制)U+001F
:空格U+0020
到 U+0021
:符号U+002F
到 U+0030
:数字U+0039
到 U+003A
:符号U+0040
到 U+0041
:大写字母U+005A
到 U+005B
:符号U+0060
到 U+0061
:小写字母U+007A
到 U+007B
:符号U+007E
:删除(控制)U+007F
到 U+0080
:Latin1-Supplement 符号。U+008C
到 U+008D
:设备(即控制)U+009F
:不间断空格。 (即,U+00A0
)
到 U+00A1
:符号。U+00BF
到 U+00C0
:重音字符。Unicode 以支持非拉丁字符集而闻名,那么这些其他块是什么?这只是一个广泛的概述,有关完整的完整列表,请参阅 wikipedia.org page。
Latin1 和 Latin1 相关块
U+00FF
到 U+0000
:基本拉丁语U+007F
到 U+0080
:Latin-1 补充U+00FF
到 U+0100
: 拉丁文扩展-AU+017F
到 U+0180
: 拉丁文扩展-B组合块
U+024F
到 U+0250
:3 个块。
非拉丁语,语言块
U+036F
到 U+0370
:55 块。
非拉丁语、语言补充块
U+1C7F
到 U+1C80
:11 个块。
符号块
U+209F
到 U+20A0
:22 块。
古代语言块
U+2BFF
到 U+2C00
:1 块(格拉哥里语)。
语言扩展块
U+2C5F
到 U+2C60
:66 块。
特殊块
U+FFEF
到 U+FFF0
:1 块(特价)。
答案 6 :(得分:0)
一种方法是将每个字符渲染到纹理并手动检查它是否可见。此解决方案不包括空格。
我编写了这样一个程序,并用它来确定前 471859 个代码点中大约有 467241 个可打印字符。我选择这个数字是因为它涵盖了 Unicode 的所有前 4 个平面,这些平面似乎包含所有可打印的字符。见https://en.wikipedia.org/wiki/Plane_(Unicode)
我很想改进我的程序以生成范围列表,但现在我正在为需要立即回答的人提供以下内容:
https://editor.p5js.org/SamyBencherif/sketches/_OE8Y3kS9
我发布这个工具是因为我认为这个问题吸引了很多正在寻找了解可打印范围的略有不同应用的人。希望这是有用的,即使它不能完全回答问题。
答案 7 :(得分:-7)