2009-05-20 13 views
12

Me gustaría poder obtener una matriz char de todos los caracteres imprimibles en C#, ¿alguien sabe cómo hacer esto?¿Cómo obtengo una lista de todos los caracteres imprimibles en C#?

edición:

Por imprimible me refiero a los caracteres europeos visibles, así que sí, diéresis, tildes, los acentos, etc.

+0

definir imprimible – AnthonyWJones

+0

Por favor, defina "imprimir" -.? ¿quiere decir simplemente "caracteres imprimibles ASCII" (según ilivewithin's answe r) o le gustaría incluir caracteres acentuados? –

+0

Supongo que por impresión estamos hablando de imprimibles en papel? Si busca solo una búsqueda de Asci http://www.asciitable.com es una. Para unicode charmap.exe es la opción obvia. –

Respuesta

22

Esto le dará una lista con todos los caracteres que no se consideran caracteres de control :

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); 
    } 
} 

Es posible que desee investigar los otros Char.IsXxxx métodos para encontrar una combinación que se adapte a sus necesidades.

+0

Por una razón que no entiendo, si lo hace: for (char c = char.MinValue; c <= char.MaxValue; C++) OutOfMemoryException - la lista se llena rápidamente –

+0

Parece que la sentencia C++ hace que el contador se ajuste a 0 después de 65535, lo que significa que c <= char.MaxValue siempre será verdadero. El int puede contener valores más grandes, por lo que aumenta el beyound char.MaxValue, y se cumple la condición de salida y el bucle se detiene. –

+0

(a veces me gustaría que los comentarios puedan ser editados para que esos molestos errores de ortografía puedan ser eliminados ...) –

3

Una solución LINQ (basado en Fredrik Mörk de):

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

¿Ha intentado compilar/ejecutar eso? :) –

+0

Vaya, necesito el elenco allí. Aclamaciones. – Noldorin

+0

No funcionará a partir de 3.5SP1. Ver mi respuesta –

18

Aquí hay una versión de la solución de LINQ Fredrik. Tenga en cuenta que Enumerable.Range produce un IEnumerable<int>, por lo que primero debe convertir a caracteres. Cast<char> habría trabajado en 3.5SP0 creo, pero a partir de 3.5SP1 que tiene que hacer un "adecuado" conversión:

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

He creado el resultado como una matriz como eso es lo que la pregunta pidió - es no necesariamente la mejor idea sin embargo. Depende del caso de uso.

Tenga en cuenta que esto tampoco considera caracteres Unicode completos, solo aquellos en el plano multilingüe básico. No sé qué devuelve para sustitutos altos/bajos, pero al menos vale la pena saber que un solo char realmente no le permite representar todo :(

+0

Realmente necesito profundizar en las cosas de Linq, hay algunas soluciones elegantes para encontrar allí: o) –

+0

Maldición, así que le gané a Jon Skeet y mi respuesta aún se pierde. :(Solo como una nota: puede reemplazar esa llamada Select por un Cast para hacerlo marginalmente más agradable. – Noldorin

+1

Downvoters, por favor, den razones. (Tenga en cuenta que aunque esto es similar a la respuesta de Noldorin, creo que brinda más información, y funciona :) –

0

Sé que ASCII no se solicitó específicamente, pero esta es una . manera rápida de obtener una lista de todos los caracteres ASCII imprimibles

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

Ver este ASCII table

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

Agregue una explicación con la respuesta de cómo esta respuesta ayuda a OP a corregir el problema actual –

Cuestiones relacionadas