Unicode可打印字符的范围是多少?

Unicode可打印字符的范围是多少?,unicode,character-encoding,unicode-string,Unicode,Character Encoding,Unicode String,谁能告诉我Unicode可打印字符的范围是多少?[例如,Ascii可打印字符范围为\u0020-\u007f],粘贴术语没有范围。数字可以无限大 您给出的不是UTF8,它有1个字节表示ASCII字符 至于范围,我认为没有可打印字符的范围。它总是在进化。查看我上面给出的页面。请参阅 您可能需要特别关注C0和C1控制字符 维基上说,C0控制字符的范围是U+0000-U+001F和U+007F(与ASCII的范围相同),C1控制字符的范围是U+0080-U+009F 除了C-控制字符外,Unicode

谁能告诉我Unicode可打印字符的范围是多少?[例如,Ascii可打印字符范围为\u0020-\u007f]

,粘贴术语没有范围。数字可以无限大

您给出的不是UTF8,它有1个字节表示ASCII字符

至于范围,我认为没有可打印字符的范围。它总是在进化。查看我上面给出的页面。

请参阅

您可能需要特别关注C0和C1控制字符

维基上说,C0控制字符的范围是U+0000-U+001F和U+007F(与ASCII的范围相同),C1控制字符的范围是U+0080-U+009F

除了C-控制字符外,Unicode还具有数百个格式控制字符,例如零宽度非连接符,这使字符间距更近,或者是双向文本控制。这种格式控制字符比较分散


更重要的是,您在做什么,要求您了解Unicode的不可打印字符?更可能的是,无论你试图做什么,都是解决问题的错误方法。

首先,你应该删除问题中的“UTF8”一词,它与问题无关(UTF8只是Unicode编码的一种,它与你的问题是正交的)

第二:“可打印/不可打印”在Unicode中的含义不太清楚。也许你指的是一个“;人们甚至可以质疑空间是否可打印/图形化。非图形字符基本上由控制字符组成:范围0x00-0x0f加上一些分散的其他字符

无论如何,绝大多数Unicode字符(超过200.000个)都是“图形化”的。但这当然并不意味着它们可以在您的环境中打印


在我看来,如果您打算生成一个“随机可打印”的unicode字符串,尝试包含所有“可打印”字符,这似乎是一个坏主意。

您应该选择一种字体,然后生成一个列表,列出为您的字体定义了哪些unicode字符的字形。你可以使用像freetype这样的字体库来测试字形(测试FT_Get_Char_Index(…)!=0)。

这是一个老问题,但它仍然有效,我认为还有更多有用的,但简单地说,关于这个问题,现有答案没有涵盖

统一码 Unicode定义

其中一个属性是“一般类别”,它有主要的类和子类。主要的类有字母、标记、标点符号、符号、分隔符和其他

通过了解字符的属性,可以判断是否认为它们可以在特定上下文中打印。

您必须始终记住,像“字符”和“可打印”这样的术语通常比较困难,并且具有有趣的边缘情况


编程语言支持 一些编程语言帮助解决这个问题

例如,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控件。

可打印的Unicode字符范围(不包括十六进制)在int数据类型中为32到126。

哪些字符有效? 目前,Unicode的定义是从
U+0000
开始,在
U+10FFFF
结束。第一个区块为基本拉丁语,跨越
U+0000
U+007F
,最后一个区块为补充专用区-B,跨越
U+100000
10FFFF
。如果要查看所有这些块,请参见此处:

让我们把拉丁语块1中有效/无效的部分分解

拉丁语块:TLDR 如果您有兴趣过滤掉任何一个不可见字符,则需要过滤掉:

  • 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
    U+008C<