2008-09-26 21 views
11

aquí está el problema:Cómo convertir un carácter Unicode a su equivalente ASCII

En C# que estoy recibiendo información de una base de datos heredada ACCESO. .NET convierte el contenido de la base de datos (en el caso de este problema, una cadena) en Unicode antes de entregarme el contenido.

¿Cómo convierto esta cadena Unicode a su equivalente ASCII?


Editar
Unicode Char 710 es de hecho ACCENT MODIFICADOR CARTA CIRCUNFLEJO. Aquí está el problema un poco más preciso:

 -> (Extended) ASCII character ê (Extended ASCII 136) was inserted in the database. 
-> Either Access or the reading component in .NET converted this to U+02C6 U+0065 
    (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER E) 
-> I need the (Extended) ASCII character 136 back. 


Esto es lo que he intentado (ahora veo por qué esto no funciona, ...):

string myInput = Convert.ToString(Convert.ToChar(710)); 
byte[] asBytes = Encoding.ASCII.GetBytes(myInput); 

Pero esto no da lugar a 94 pero un byte con valor de 63 ...
Aquí es un nuevo intento, pero aún así no funciona:

byte[] bytes = Encoding.ASCII.GetBytes("ê"); 


Soltution
Gracias a ambos csgero y bzlm para que apunta en la dirección correcta que resuelven el problema here.

+1

El término "ASCII extendido" es confuso. Si sus datos de entrada son realmente ASCII, entonces no hay "o un" número de carácter 136 ". Es más probable que sus datos contengan caracteres no representables por ASCII, como datos internacionales representables por codificaciones heredadas de 8 bits como Windows-1252. – bzlm

+0

Lo sé, hay todo un artículo de Wikipedia sobre el tema. – Huppie

+0

Debe publicar la solución como una respuesta y no en la pregunta para que podamos votar por ella. –

Respuesta

9

Bien, elaboremos. Ambos csgero y bzlm apuntaban en la dirección correcta.

Debido a la respuesta de blzm busqué la página de Windows-1252 en la wiki y encontré que se llama una página de códigos. El artículo de Wikipedia para Code page que se afirma lo siguiente:

No existía norma oficial para estos ‘extended character sets’; IBM simplemente se refirió a las variantes como páginas de códigos, como siempre lo había hecho para variantes de codificaciones EBCDIC.

Esto me llevó a la página de códigos 437:

n páginas de códigos compatibles con ASCII, los menores de 128 caracteres mantienen sus valores estándar US-ASCII, y diferentes páginas (o conjuntos de caracteres) podrían ser hechas disponible en los 128 caracteres superiores. Las computadoras DOS construidas para el mercado norteamericano, por ejemplo, usaban code page 437, que incluía caracteres acentuados necesarios para el francés, el alemán y algunos otros idiomas europeos, así como algunos caracteres gráficos de trazado de líneas.

Por lo tanto, la página de códigos 437 fue la página de códigos que estaba llamando 'ASCII extendida', que tenía el E como carácter 136 así que busqué algunos otros caracteres también y parece estar bien.

csgero vino con la indirecta Encoding.GetEncoding(), lo usé para crear la siguiente declaración que resuelve mi problema:

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê"); 
+3

Consulte el tema de Normalización Unicode, específicamente las dos formas de equivalencia: canónica y compatibilidad - http://en.wikipedia.org/wiki/Unicode_normalization En una instancia de .NET String, llame al método Normalize, pasando NormalizationForm.FormD o NormalizationForm. FormKD, que corresponde a las formas canónica y de compatibilidad ** descompuesta **. Por ejemplo, llamar esto a una cadena como "êwś", producirá la cadena "e^ws". También puede hacer lo contrario, convirtiendo una cadena como "e ^" en "ê" llamando a Normalizar (NormalizationForm.FormC) o Normalizar (NormalizationForm.FormKC). – Triynko

0

Hmm ... No estoy seguro de a qué personaje se refiere. El símbolo de intercalación ("^", CIRCUMFLEX ACCENT) tiene el mismo código en ASCII y Unicode (U + 005E).

/EDIT: Maldita sea, mi culpa. 710 (U + 02C6) es en realidad la LETRA MODIFICADORA CIRCUMFLEX ACCENT. Desafortunadamente, este personaje no es parte de ASCII en absoluto. Puede parecer el símbolo normal pero es un personaje diferente. La conversión simple no ayudará aquí. No estoy seguro de si .NET admite el mapeo de caracteres similares al convertir desde Unicode. Vale la pena investigar, sin embargo.

+0

Acabo de editar la publicación para reflejar lo que significaba el OP. :-) –

+0

Unicode! = UTF-8 –

+0

OJ: ¿Qué tiene esto que ver con UTF-8? –

0

El valor 63 es el signo de interrogación, AKA "No puedo mostrar este carácter en ASCII".

+0

Entonces, estás identificando mi problema. La pregunta es cómo HAGO esto, sé que el método que probé no funciona. – Huppie

3

No puede usar la codificación ASCII predeterminada (Encoding.ASCII) aquí, pero debe crear la codificación con la página de códigos apropiada utilizando Encoding.GetEncoding (...). Puede intentar usar la página de códigos 1252, que es un superconjunto de ISO 8859-1.

+0

Como tal: byte [] bytes = Encoding.GetEncoding (437) .GetBytes ("ê"); – Huppie

2

ASCII no define ê; el número 136 proviene del número para el circunflejo en codificaciones de 8 bits como Windows-1252.

¿Se puede verificar que una pequeña e con un circunflejo (ê) es en realidad lo que se supone que se almacena en la base de datos de Access en este caso? Quizás U + 02C6 U + 0065 es el resultado de un error de conversión, donde la entrada es en realidad un e seguido por un circunflejo, o algo completamente distinto. Quizás su base de datos de Access tenga datos corruptos en el sentido de que la codificación designada no coincide con el contenido, en cuyo caso el cliente .NET podría analizar los datos incorrectamente (utilizando el decodificador incorrecto).

Si este error se introdujo efectivamente durante la lectura de la base de datos, quizás pegar algunos códigos o configuraciones podría ayudar.

En Code page 437, el número de carácter 136 es una e con un circunflejo.

+0

¡Gracias! Tu sugerencia ayudó mucho, fue en realidad la página de códigos 437 (MS-DOS). Usando Encoding.GetEncoding (437) funcionó. – Huppie

Cuestiones relacionadas