1

Salut !

Tout comme Brunni fait sa pub pour son petit outil bien utile à certains, j'en profite pour faire de même.
Depuis presque un mois, j'ai développé sur mon temps libre un petit outil qui permet d'analyser un texte Unicode, et une lib. Comme je pense que c'est quand même le genre de truc qui peut intéresser des gens, je le met ici, mais je me doute bien que ça ne révolutionnera pas le monde smile

v0II

L'idée, c'est de copier un bout de texte avec un ou plusieurs caractères sur lesquels on veut des infos, et puis ça s'affiche. smile

J'ai mis le code et un lien sur GitHub, pour ceux que ça intéresse: https://github.com/GoldenCrystal/NetUnicodeInfo

Tout est parti d'un truc très con, mais j'en avais marre de me retrouver à me demander « Mais c'est quoi ce caractère ? Comment il a fait ça ? », du coup m'est venu l'idée de coder un truc à l'arrache (mais vraiment) pour satisfaire mon immense curiosité. Et c'est là que tout s'est enchaîné. grin

Là, je pourrais vous raconter toutes mes péripéties de développement, mais je ne voudrais pas vous endormir.

En l'état actuel, il y a deux aspects:
 • Le logiciel. Là pas trop de souci, je ne vous cache pas que je suis assez content de mon truc (j'ai le droit, non ? tongue) simpliste, et c'est le truc principal que je veux vous vendre grin (Je dis pas qu'il est complet par contre hein tongue)
 • La lib que j'ai codé derrière. C'est surtout pour ça que je l'ai mis sur GitHub, sinon je vois pas franchement l'intérêt smile (L'interface ne fait vraiment pas grand chose de compliqué)

Pour ce qui est de l'outil, si ça vous intéresse, allez le tester, et n'hésitez pas à faire des suggestions tongue




Maintenant concernant la lib. Mon intuition, c'est que le boulot que j'ai fait pourrait servir dans d'autres cas. J'avais fait quelques recherches là dessus, pas forcément pour ce "projet", et j'avais pas l'impression que les outils d'accès aux données Unicode soient quelque chose de très répandu en .NET* (ou ailleurs en fait, mais ça m'intéresse pas là grin) bien que des questions ressortent de temps à autre. Maintenant, je peux me tromper, et si c'est le cas, c'est pas grave. De toutes façons, la demande n'est clairement pas fulgurante grin
Le fait est que même en supposant qu'il existe des gens qui seraient intéressés par un outil de ce genre, je ne sais pas quels sont leurs besoins concret. Le truc que j'ai là est incomplet (j'ai mis les propriétés les plus générales et les plus intéressantes de mon point de vue) et plutôt du domaine de l'artillerie lourde. (On charge tout en mémoire à la première utilisation)
Malgré tout, ça peut toujours être le point de départ d'un super truc, même si j'ai quand même quelques doutes tongue

Bref, j'ai un outil qui affiche certaines infos, et une lib qui fournit ces infos, et jusque là, c'est pas mal. Après en tant qu'utilisateur unique du truc que j'ai produit, le comportement me va, mais j'ai franchement aucune idée de ce qu'un mec qui voudrait utilise ma lib souhaiterait point de vue mémoire, performances, et jeu de données fourni.
Voilà tout ce qui me tracasse

 • J'ai pas encore bien compris la spec Unicode en ce qui concerne le nommage des caractères Coréens, donc c'est un truc pas implémenté. (Bouh !)
 • Chaque fichier de données unicode ou propriété ajouté en plus augmentent considérablement la taille du fichier final. Où se trouve le juste milieu ?
   • Unicode, c'est vaste, on peut pas se permettre de traiter tout n'importe comment, sinon ça va plomber l'application qui utilise la lib.
   • Faut-il que je développe un format plus compact ?
   • J'ai inclus certaines propriétés de Unihan, parce que je trouvais ça cool, mais surtout parce que sinon il n'y a aucune info sérieuse sur la plupart des caractères asiatiques (Chinois principalement), mais du coup ça a fait exploser la taille de ma petite base de données interne. Faut-il garder ça ? Faire une version avec et une version sans ?
 • Est-ce que l'utilisateur lambda de la lib préfèrera une consommation mémoire restreinte avec risque de GC ou alors un temps de recherche plus court sans GC ?
 • Architecturalement, est-ce mieux d'avoir un API simple, ou un truc un peu plus complexe qui permette de gérer soi-même le fichier de données ?
 • Franchement, est-ce qu'il y a réellement quelqu'un que ça intéressera ?
   • Au minimum ça permet de faire évoluer l'outil vers une nouvelle version de Unicode si jamais il intéresse quelqu'un d'autre que moi, mais bon grin


Dans l'immédiat, je pense que je vais enjoliver quelques trucs (ajouter un icône !), peut-être ajouter quelques propriétés selon mon humeur, et ensuite je ferai une belle version 1.0 avec un package NuGet pour la lib. Après j'en sais rien grin
Comme tout le monde, j'aimerais que mon projet soit utile, mais j'ai aucune idée de si ça peut vraiment servir à quelqu'un. Alors, on verra bien tongue



* Pour info, c'est assez dommage, bien que parfaitement compréhensible, mais la BCL .NET ne permet que d'accéder à des donées simples et essentielles qui sont la catégorie et la valeur numérique d'un caractère (selon le standard Unicode en vigueur au moment de la publication de la version de .NET)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

2

Ça a l'air bien cool, par contre je pense que ça vaudrait le coup d'expliquer (en français et sans pavé ça serait encore mieux grin) ce qu'elle fait concrètement, cette lib smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Tu colles un bout de texte unicode, et ça te le découpe en caractères, et tu as sur chaque caractère les infos classiques (code, etc.)
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

4

Oui, l'application j'ai compris en regardant le screenshot, mais j'ai du mal à voir ce que fait la lib derrière. Toutes ces infos ne sont pas disponibles directement via l'API .NET, du coup elle en ajoute quelques unes ? Ou bien c'est autre chose qui n'a rien à voir ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

En fait, la lib embarque une "base de données" dans un format custom. Il y a deux étapes:
 • Un programme construit la base de données à partir des données officielle de Unicode (UCD)
 • La lib fournit l'accès aux informations sur les points de code recensés dans cette base de données. (On peut pas facilement se mélanger aux données de .NET car il faudrait faire attention de se caler sur la même version du standard Unicode… Du coup la lib importe les données les plus récentes, de Unicode V7.0)

La lib va charger les données en mémoire et exposer ces propriétés via un modèle objet. De fait, une partie du standard Unicode est codée dans la structure de la lib et non dans les données.

Concrètement, la classe UnicodeInfo te permet de récupérer un objet qui contient des propriétés Unicode d'un caractère. Par exemple, si tu veux savoir si un caractère a la propriété "Math", tu peux regarder UnicodeInfo.GetCharInfo(c).CoreProperties.
Cette valeur est un masque binaire (un enum [Flags]) où chaque bit correspond à une des propriétés de DerivedCoreProperties.txt, et tu trouveras donc un bit "Math" défini si le caractère a la propriété "Math".

J'ai mis dans le readme sur GitHub la liste des propriétés qui sont supportées, normalement j'ai pas commis trop d'erreurs en la construisant tongue

Accessoirement, j'ai ajouté un énumérateur de points de codes d'une chaîne de caractères, et une méthode qui retourne une représentation graphique sensible d'un caractère Unicode (i.e. une séquence d'autres points de code) pour les trucs un peu spéciaux: Caractères de contrôle (CR, LF, etc.) et caractères à combiner (e.g. diacritiques).

L'interface publique de la lib se résume à peu près à ça, en omettant les détails inutiles: namespace System.Unicode { public static class UnicodeInfo { public static UnicodeCharInfo GetCharInfo(int codePoint); public static UnicodeCategory GetCategory(int codePoint); public static string GetDisplayText(UnicodeCharInfo charInfo); public static string GetDisplayText(int codePoint); } public struct UnicodeCharInfo { public int CodePoint { get; } public string Name { get; } public UnicodeCategory Category { get; } public string Block { get; } public CanonicalCombiningClass CanonicalCombiningClass { get; } public BidirectionalClass BidirectionalClass { get; } public CompatibilityFormattingTag DecompositionType { get; } public string DecompositionMapping { get; } public UnicodeNumericType NumericType { get; } public UnihanNumericType UnihanNumericType { get; } public UnicodeRationalNumber? NumericValue { get; } public bool BidirectionalMirrored { get; } public string OldName { get; } public string SimpleUpperCaseMapping { get; } public string SimpleLowerCaseMapping { get; } public string SimpleTitleCaseMapping { get; } public ContributoryProperties ContributoryProperties { get; } public CoreProperties CoreProperties { get; } public string Definition { get; } public string MandarinReading { get; } public string CantoneseReading { get; } public string JapaneseKunReading { get; } public string JapaneseOnReading { get; } public string KoreanReading { get; } public string HangulReading { get; } public string VietnameseReading { get; } public string SimplifiedVariant { get; } public string TraditionalVariant { get; } } public static class StringExtensions { public static CodePointEnumerable AsCodePointEnumerable(this string s); } public struct CodePointEnumerable : IEnumerable<int> { public CodePointEnumerable(string text); public string Text { get; } public CodePointEnumerator GetEnumerator(); } }
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

6

Merci pour les explications smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Voilà, j'ai fait une mise à jour avec les trucs que j'estime qu'il manquait vraiment, et j'ai créé un package NuGet. (dll de 1,3Mo mais bon grin)
Si jamais ça vous intéresse, tout est toujours dispo au même endroit. tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes