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

Ani*_*jee 45 unicode character-encoding unicode-string

任何人都可以告诉我Unicode可打印字符的范围是什么?[例如Ascii可打印字符范围是\ u0020 - \u007f]

Lie*_*yan 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的不可打印字符?更有可能的是,无论你想做什么,都是解决问题的错误方法.

  • 我想创建一个随机的unicode字符串生成器,它将生成可打印的字符. (5认同)
  • 可由谁打印?你想包括吗?所有的汉字?许多用户不会使用它们的字体,因此"打印"它们不会给你任何东西,空白框或其他一些无用的替换字符. (5认同)
  • 一个很好的理由是避免安全漏洞:https://bugzilla.mozilla.org/show_bug.cgi?id = 968576 (5认同)
  • *“您在做什么,需要您知道 Unicode 的不可打印字符?”* 用户将 Windows 计算器中的数字粘贴到文本框中(例如“165063688192”)。但实际上字符串将是:“U+202D”“165063688192”“U+202C”。因此,该字符串将无法解析,并且没有人能够找出原因。因此,多亏了一个没人想要的功能:我们现在需要编写 `TrimStrimToPrintable(String s)` 函数。 (4认同)

leo*_*loy 13

首先,你应该在你的问题中删除"UTF8"这个词,它是不相关的(UTF8只是Unicode编码之一,它与你的问题正交).

第二:在Unicode中,"可打印/不可打印"的含义不太清楚.也许你的意思是" 图形特征 "; 如果空间是可打印的/图形的,人们甚至可以提出异议.非图形字符基本上由控制字符组成:范围0x00-0x0f加上其他一些分散的字符.

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

在我看来,如果你打算生成一个"随机可打印"的unicode字符串,试图包含所有"可打印"字符,这似乎是一个坏主意.


Red*_*ick 8

这是一个古老的问题,但仍然有效,我认为关于该主题的有用但简短的发言要比现有答案涵盖的更多。

统一码

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.
Run Code Online (Sandbox Code Playgroud)

请注意,它说的是“定义为Go可打印”,而不是“定义为Unicode可打印”。似乎Unicode向导不敢深入。


可列印

您对Unicode的了解越多,您就越能认识到人类写作系统异常地多样化和深不可测。

特别地,特定“字符”是否可打印并不总是很明显。

零宽度空间是否可打印?连字点何时可以打印?是否存在一些字符的可打印性取决于它们在单词中的位置或与其相邻的字符?组合字符是否始终可以打印?


脚注

ASCII可打印字符范围是\ u0020-\ u007f

不,不是。\ u007f是DEL,通常不视为可打印字符。例如,它与标有“ DEL”的键盘键相关联,键盘键的最早目的是命令从某种介质(显示,文件等)中删除字符。

实际上,许多8位字符集具有许多不可打印的非连续范围。参见例如C0和C1控件。


小智 5

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


Hol*_*ger 5

哪些字符有效?

目前,Unicode 定义为从 开始U+0000并结束于U+10FFFF。第一个块“基本拉丁语”跨越U+0000U+007F,最后一个块“补充私人使用区域-B”跨越U+10000010FFFF。如果您想查看所有这些块,请参见此处:Wikipedia.org:Unicode 块;块列表

让我们来分析一下拉丁语块 1 中的有效/无效内容。

拉丁语块:TLDR

如果您有兴趣过滤掉任何不可见字符,您将需要过滤掉:

  • U+0000控制U+0008
  • U+000Eto U+001F:设备(即控制)
  • U+007F:删除(控制)
  • U+008Dto U+009F:设备(即控制)

拉丁块:全音域

这是拉丁语块,分为更小的部分......

  • U+0000控制U+0008
  • U+0009U+000C: 空间
  • U+000Eto U+001F:设备(即控制)
  • U+0020: 空间
  • U+0021U+002F:符号
  • U+0030U+0039:数字
  • U+003AU+0040:符号
  • U+0041U+005A:大写字母
  • U+005BU+0060:符号
  • U+0061to U+007A: 小写字母
  • U+007BU+007E:符号
  • U+007F:删除(控制)
  • U+0080to U+008C:Latin1-补充符号。
  • U+008Dto U+009F:设备(即控制)
  • U+00A0: 不间断空格。(IE, 
  • U+00A1U+00BF:符号。
  • U+00C0to U+00FF:重音字符。

其他街区

Unicode 以支持非拉丁字符集而闻名,那么这些其他块是什么?这只是一个广泛的概述,请参阅wikipedia.org 页面以获取完整的列表。

Latin1 和 Latin1 相关块

  • U+0000to U+007F: 基础拉丁语
  • U+0080U+00FF:Latin-1 补充
  • U+0100U+017F:拉丁文扩展-A
  • U+0180to U+024F: 拉丁文扩展-B

可组合块

U+0250U+036F:3 个街区。

非拉丁语、语言块

U+0370U+1C7F:55 个区块。

非拉丁语、语言补充块

U+1C80U+209F:11 个街区。

符号块

U+20A0U+2BFF:22 个街区。

古代语言块

U+2C00U+2C5F:1 块(格拉哥里)。

语言扩展块

U+2C60U+FFEF:66 块。

特殊块

U+FFF0U+FFFF: 1 块(特价)。