2012-10-04 12 views
13

estoy experimentando con caracteres Unicode y tomando valores Unicode de Wikipedia páginaCómo hacer que la consola sea capaz de imprimir cualquiera de 65535 caracteres UNICODE

problema IHE es mi consola muestra todos C0 Controles y Basic caracteres latinos Unicode es decir, desde U + 0000 a U + 00FF, pero para todas las demás categorías, como Latin Extended -B, cirílico, otros languges, etc.,, la consola imprime el carácter de interrogación (?).

Mi código C# es

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace DataTypes 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      char ch = '\u0181'; 



      Console.WriteLine("the unicode character is value" + ch); 

     } 
    } 
} 

estoy trabajando en Windows 7, Visual Studio 2010. ¿Qué debo hacer para aumentar la compatibilidad con Unicode.

+3

Puede necesitar cambiar la fuente o la página de códigos de su consola; ver http://stackoverflow.com/questions/1259084/what-encoding-code-page-is-cmd-exe-using – nneonneo

+3

Esto no suena como una limitación de C#/.NET, sino más bien: una limitación de la consola . Por ejemplo, mi consola está en ["ibm850"] (http://en.wikipedia.org/wiki/Code_page_850), una página de códigos de 8 bits: no hay posibilidad de escribir unicode completo en "ibm850". –

+1

Solo hay tres fuentes disponibles en mi consola ... Lucida, Consolas, Ráster ... ¿es esto debido a esta limitación? –

Respuesta

19

Hay una gran cantidad de historia detrás de esa pregunta, voy a fideos durante un tiempo primero. Las aplicaciones del modo consola solo pueden operar con una codificación de texto de 8 bits. Esto se remonta a una decisión de diseño tomada hace 42 años por Ken Thompson et al cuando diseñaron Unix. Una característica central de Unix fue que la E/S del terminal se realizó a través de las tuberías y se podían encadenar las tuberías para alimentar la salida de un programa a la entrada de otro. Esta característica también se implementó en Windows y también es compatible con .NET con las propiedades ProcessStartInfo.RedirectStandardXxxx.

Buena característica, pero se convirtió en un problema cuando los sistemas operativos comenzaron a adoptar Unicode. Windows NT fue el primero que fue totalmente Unicode en su núcleo. Los caracteres Unicode siempre deben estar codificados, una opción común en aquel entonces era UCS, que luego se transformó en utf-16. Ahora hay un problema con la redirección de E/S, un programa que escupe caracteres codificados de 16 bits no va a funcionar bien cuando se redirige a un programa que todavía usa caracteres codificados de 8 bits.

Acredite también a Ken Thompson al encontrar una solución para este problema, inventó la codificación de utf-8.

Eso funciona en Windows también. Fácil de hacer en una aplicación de modo de consola, hay que volver a asignar la propiedad Console.OutputEncoding:

using System; 
using System.Text; 

class Program { 
    static void Main(string[] args) { 
     Console.OutputEncoding = Encoding.UTF8; 
     Console.WriteLine("Ĥėļŀō ŵŏŗłđ"); 
     Console.ReadLine(); 
    } 
} 

Ahora vamos sin embargo encuentra con otro problema, la fuente seleccionada para la ventana de la consola es probable que sea incapaz de renderizar el texto Presione Alt + espacio para invocar el menú del sistema, Propiedades, pestaña Fuente. Tendrá que elegir una fuente que no sea de trama. Los pickings son muy delgados, en Vista y más puedes elegir Consolas. Vuelva a ejecutar su programa y los caracteres acentuados se deben representar correctamente. Desafortunadamente, forzar la fuente de la consola mediante programación es un problema, deberá documentar este paso de configuración. Además, una fuente como Consolas no tiene el conjunto completo de posibles glifos Unicode. Es probable que veas rectángulos aparecer para los puntos de código Unicode para los cuales no tiene glifos. Todo un recordatorio poco sutil de que crear un programa GUI es realmente su mejor opción.

+0

Muchas gracias señor ... chicos geniales en Stack Overflow .. –

+0

@ Hans Passant ¡Esta es una gran explicación! Gracias por la lección de historia :) - el único problema que tengo con la creación de un programa GUI, es que no ofrece todas las posibilidades que tiene la consola en lo que respecta al trabajo con texto ... reflexionar sobre cómo crear el Matrix Rain en una aplicación de WinForms ... es casi imposible porque no puedes poner una hoja de texto en algún lugar sin usar GDI +, y luego te encuentras con grandes obstáculos como la persistencia y el parpadeo ... etc ... Todo eso para decir: sí, Los programas de GUI funcionan ... la mayoría del tiempo;) – MaxOvrdrv

Cuestiones relacionadas