Pregunta

Aquí está el problema:

En C #, estoy obteniendo información de una base de datos de ACCESS heredada. .NET convierte el contenido de la base de datos (en el caso de este problema en una cadena) a Unicode antes de pasarme el contenido.

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


Editar
Unicode char 710 es, de hecho, MODIFIER LETTER CIRCUMFLEX ACCENT. 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 funcionó ...):

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

Pero esto no resulta en 94 sino en un byte con valor 63 ...
Aquí hay un nuevo intento pero aún no funciona:

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


Solución
Gracias a ambos csgero y bzlm para señalar en la dirección correcta Resolví el problema aquí .

¿Fue útil?

Solución

Está bien, vamos a elaborar. Tanto csgero y < a href = "https://stackoverflow.com/questions/138449/how-to-convert-a-unicode-character-to-its-extended-ascii-equivalent#138583"> bzlm apuntado a la derecha dirección.

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 página de códigos que indica lo siguiente:

  

No existía una norma formal para estos & # 8216; conjuntos de caracteres extendidos & # 8217; ; IBM simplemente se refirió a las variantes como páginas de códigos, como siempre había hecho con las variantes de las codificaciones EBCDIC.

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

  

En las páginas de códigos compatibles con ASCII, los 128 caracteres inferiores mantuvieron sus valores estándar de US-ASCII, y diferentes páginas (o conjuntos de caracteres) podrían estar disponibles en los 128 caracteres superiores. Las computadoras DOS construidas para el mercado norteamericano, por ejemplo, usaron página de códigos 437 , que incluía acentuado caracteres necesarios para francés, alemán y algunos otros idiomas europeos, así como algunos caracteres de dibujo de líneas gráficas.

Entonces, la página de códigos 437 era la página de códigos que llamaba 'ASCII extendido', tenía el & # 234; como personaje 136, así que busqué algunos otros caracteres también y me parecen correctos.

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

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

Otros consejos

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 usando Encoding.GetEncoding (...). Puede intentar usar la página de códigos 1252, que es un superconjunto de ISO 8859-1.

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

¿Puede verificar que una pequeña e con un circunflejo (& # 234;) sea realmente 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 de 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 incorrectamente los datos (utilizando el decodificador incorrecto).

Si este error se introdujo durante la lectura de la base de datos, tal vez sea útil pegar algunos ajustes de código o configuración.

En Página de código 437 , el carácter número 136 es una e con una circunfleja.

Hmm & nbsp; & # 8230; No estoy seguro de a qué personaje te refieres. El caret (& # 8220; ^ & # 8221 ;, CIRCUMFLEX ACCENT) tiene el mismo código en ASCII y Unicode (U + 005E).

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top