web-dev-qa-db-fra.com

Quelle est la gamme de caractères imprimables Unicode?

Quelqu'un peut-il me dire quelle est la gamme de caractères imprimables Unicode? [par exemple. La plage de caractères imprimables Ascii est\u0020 -\u007f]

49
Anindya Chatterjee

Voir, http://en.wikipedia.org/wiki/Unicode_control_characters

Vous voudrez peut-être regarder en particulier les caractères de contrôle C0 et C1 http://en.wikipedia.org/wiki/C0_and_C1_control_codes

Le wiki dit, le caractère de contrôle C0 est dans la plage U + 0000 — U + 001F et U + 007F (qui est la même plage que ASCII) et le caractère de contrôle C1 est dans la plage U + 0080 — U + 009F

autre que le caractère de contrôle C, Unicode a également des centaines de caractères de contrôle de formatage, par ex. non-joiner de largeur nulle, ce qui rend l'espacement des caractères plus proche ou le contrôle de texte bidirectionnel. Ces caractères de contrôle de mise en forme sont plutôt dispersés.

Plus important encore, que faites-vous qui vous oblige à connaître les caractères non imprimables d'Unicode? Plus probable qu'improbable, tout ce que vous essayez de faire est la mauvaise approche pour résoudre votre problème.

18
Lie Ryan

Tout d'abord, vous devez supprimer le mot 'UTF8' dans votre question, ce n'est pas pertinent (UTF8 n'est qu'un des encodages d'Unicode, c'est quelque chose d'orthogonal à votre question).

Deuxièmement: la signification de "imprimable/non imprimable" est moins claire dans Unicode. Peut-être que vous voulez dire un " caractère graphique "; et on peut même contester si un espace est imprimable/graphique. Les caractères non graphiques consisteraient essentiellement en caractères de contrôle: la plage 0x00-0x0f plus quelques autres qui sont dispersés.

Quoi qu'il en soit, la grande majorité des caractères Unicode (plus de 200 000) sont "graphiques". Mais cela n'implique certainement pas qu'ils sont imprimables dans votre environnement.

Cela me semble une mauvaise idée, si vous avez l'intention de générer une chaîne unicode "imprimable au hasard", d'essayer d'inclure tous les caractères "imprimables".

13
leonbloy

C'est une vieille question, mais elle est toujours valable et je pense qu'il y a plus à dire utilement, mais brièvement, sur le sujet que ce qui est couvert par les réponses existantes.

Unicode

Unicode définit propriétés des caractères .

L'une de ces propriétés est la "catégorie générale" qui a des classes et des sous-classes principales. Les principales classes sont Lettre, Marque, Ponctuation, Symbole, Séparateur et Autre.

En connaissant les propriétés de vos personnages, vous pouvez décider si vous les considérez imprimables dans votre contexte particulier.

Vous devez toujours vous rappeler que des termes comme "caractère" et "imprimable" sont souvent difficiles et ont des cas Edge intéressants.


Prise en charge du langage de programmation

Certains langages de programmation aident à résoudre ce problème.

Par exemple, le langage Go a un package "unicode" qui fournit de nombreuses fonctions utiles liées à Unicode, y compris ces deux:

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.

Notez qu'il dit "défini comme imprimable par Go" et non par "défini comme imprimable par Unicode". C'est presque comme s'il y avait des profondeurs que les sorciers d'Unicode n'osent pas mettre d'aplomb.


Imprimable

Plus vous en apprendrez sur Unicode, plus vous réaliserez à quel point les systèmes d'écriture humains sont étonnamment diversifiés et insondables.

Il n'est pas toujours évident de savoir si un "caractère" particulier est imprimable.

Un espace de largeur nulle est-il imprimable? Quand un point de césure est-il imprimable? Y a-t-il des caractères dont l'imprimabilité dépend de leur position dans un mot ou des caractères qui leur sont adjacents? Un caractère de combinaison est-il toujours imprimable?


Notes de bas de page

La plage de caractères imprimables ASCII est\u0020 -\u007f

Non ça ne l'est pas.\u007f est DEL qui n'est normalement pas considéré comme un caractère imprimable. Il est, par exemple, associé à la touche du clavier intitulée "DEL" dont le but le plus ancien était de commander la suppression d'un caractère d'un support (affichage, fichier, etc.).

En fait, de nombreux jeux de caractères 8 bits ont de nombreuses plages non consécutives qui ne sont pas imprimables. Voir par exemple les commandes C0 et C1.

6
RedGrittyBrick

Ce que vous devez faire est de choisir une police, puis de générer une liste des caractères Unicode ayant des glyphes définis pour votre police. Vous pouvez utiliser une bibliothèque de polices comme freetype pour tester les glyphes (test pour FT_Get_Char_Index (...)! = 0).

3
jkl