2009-05-20 7 views
12

Je voudrais être en mesure d'obtenir un tableau de caractères de tous les caractères imprimables en C#, quelqu'un sait-il comment faire cela?Comment obtenir une liste de tous les caractères imprimables en C#?

modifier:

par imprimable Je veux dire les caractères européens visibles, donc oui, trémas, tildes, accents etc.

+0

définir imprimable – AnthonyWJones

+0

S'il vous plaît définir « imprimer » -.? voulez-vous dire que des « caractères ASCII imprimables » (selon la réponse de ilivewithin r) ou voudriez-vous inclure des caractères accentués? –

+0

Je suppose qu'en imprimant on parle d'imprimable sur papier? Si vous cherchez juste une recherche ascii http://www.asciitable.com est un. Pour unicode charmap.exe est l'option évidente. –

Répondre

22

Cela vous donnera une liste avec tous les caractères qui ne sont pas considérés comme des caractères de contrôle :

List<Char> printableChars = new List<char>(); 
for (int i = char.MinValue; i <= char.MaxValue; i++) 
{ 
    char c = Convert.ToChar(i); 
    if (!char.IsControl(c)) 
    { 
     printableChars.Add(c); 
    } 
} 

Vous pouvez enquêter sur les autres méthodes Char.IsXxxx pour trouver une combinaison qui convient à vos besoins.

+0

Pour une raison que je ne comprends pas, si vous faites: pour (char c = char.MinValue; c <= char.MaxValue; C++) OutOfMemoryException - la liste se remplit rapidement –

+0

Il semble que l'instruction C++ rend le compteur wrap à 0 après 65535, ce qui signifie que c <= char.MaxValue sera toujours vrai. L'int peut contenir des valeurs plus grandes, donc il augmente au-delà de char.MaxValue, et la condition de sortie est remplie et la boucle s'arrête. –

+0

(Je souhaite parfois que les commentaires puissent être édités afin que ces fautes d'orthographe ennuyeuses puissent être enlevées ...) –

3

Une solution LINQ (basée sur Fredrik Mörk de):

Enumerable.Range(char.MinValue, char.MaxValue).Select(c => (char)c).Where(
    c => !char.IsControl(c)).ToArray(); 
+0

Avez-vous essayé de compiler/courir cela? :) –

+0

Oups, besoin de la fonte là-bas. À votre santé. – Noldorin

+0

Ne fonctionne pas à partir de 3.5SP1. Vois ma réponse. –

18

Voici une version LINQ de la solution de Fredrik. Notez que Enumerable.Range donne un IEnumerable<int> donc vous devez d'abord convertir en caractères. Cast<char> aurait travaillé dans 3.5SP0 je crois, mais de 3.5SP1 vous devez faire une conversion « correcte »:

var chars = Enumerable.Range(0, char.MaxValue+1) 
         .Select(i => (char) i) 
         .Where(c => !char.IsControl(c)) 
         .ToArray(); 

J'ai créé le résultat comme un tableau comme c'est ce que la question a demandé - il est pas nécessairement la meilleure idée cependant. Cela dépend du cas d'utilisation.

Notez que cela ne tient pas compte des caractères Unicode complets, uniquement ceux du plan multilingue de base. Je ne sais pas ce qu'il retourne pour les substituts hauts/bas, mais il vaut mieux au moins savoir qu'un seul char ne vous permet pas vraiment de tout représenter :(

+0

J'ai vraiment besoin de plonger dans ce Linq stuff, il y a quelques solutions élégantes à trouver là: o) –

+0

Darn, donc j'ai battu Jon Skeet et ma réponse perd encore. :(Juste comme une note: Vous pouvez remplacer cet appel Select avec un casting pour le rendre marginalement plus agréable – Noldorin

+1

Downvoters, s'il vous plaît donner des raisons. (Notez que même si cela est similaire à la réponse de Noldorin, je crois qu'il donne plus d'informations - et ça marche :) –

0

Je sais que ASCII n'a pas été spécifiquement demandé, mais c'est un . moyen rapide d'obtenir une liste de tous les caractères ASCII imprimables

for (Int32 i = 0x20; i <= 0x7e; i++) 
{ 
    printableChars.Add(Convert.ToChar(i)); 
} 

Voir cette ASCII table

0
public bool IsPrintableASCII(char c) 
{ 
    return c >= '\x20' && c <= '\x7e'; 
} 
+1

Ajouter une explication avec une réponse sur la façon dont cette réponse aide OP à corriger le problème actuel –

Questions connexes