2012-04-03 11 views
8

Tengo algunos problemas con la codificación de caracteres. cuando pongo los dos caracteres siguientes en un archivo de texto UTF32 codificado:Problemas UTF32 y C#

y luego ejecutar este código en ellos:

System.IO.StreamReader streamReader = 
    new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false); 
System.IO.StreamWriter streamWriter = 
    new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

me sale:

鸕 
鸕 

(mismo personaje dos veces, es decir, el archivo de entrada! = salida)

Algunas cosas que pueden ayudar: Hex para el primer carácter:

15 9E 02 00

Y para el segundo:

15 9E 00 00

estoy usando gedit para la creación de archivos de texto, mono para el C# y estoy usando Ubuntu.

Tampoco importa si especifico la codificación para el archivo de entrada o salida, simplemente no me gusta si está en codificación UTF32. Funciona si el archivo de entrada está en codificación UTF-8.

El archivo de entrada es el siguiente:

FF FE 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 00 00 00

Es un error, o es sólo conmigo?

Gracias!

+0

codificación del archivo de salida? –

+0

Imprima el resultado de 'streamReader.ReadToEnd()'. – leppie

+0

@ L.B - Cambio no ayuda – AStupidNoob

Respuesta

5

K, por lo que he descubierto en mi opinión, parece que funciona ahora. Resulta que, dado que los códigos para los caracteres eran 15 9E 02 00 y 15 9E 00 00, entonces no hay forma de que se puedan mantener en uno, solo UTF-16 char. Entonces, UTF16 usa estos pares de sustituciones cosas donde hay dos personajes diferentes que actúan como un 'elemento'. Para obtener elementos, podemos usar:

StringInfo.GetTextElementEnumerator(string fred); 

y esto devuelve una cadena con los pares de sustituto. Trátelo como un personaje.

Ver aquí:

http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

http://msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.gettextelement.aspx

espero que ayude a alguien: D

0

Al escribir, no está especificando UTF-32, por lo que su valor predeterminado es Encoding.UTF8.

De MSDN:

Este constructor crea un StreamWriter con codificación UTF-8 sin de orden de bytes Marcos (BOM), por lo que su método GetPreamble devuelve una matriz de bytes vacía . Para crear un StreamWriter usando la codificación UTF-8 y una BOM, considere usar un constructor que especifique la codificación, como StreamWriter (String, Boolean, Encoding).

+0

Ese no parece ser el problema. Actualicé la pregunta para ayudar a eliminar cualquier confusión. ¡Gracias de todos modos! – AStupidNoob

0

Creo que necesita especificar la misma codificación (Encoding.UTF32) también para su StreamWriter.

EDIT:

Normalmente no se necesita entre páginas de códigos UTF pero también me intente esto:

Encoding utf8 = Encoding.UTF8; 
Encoding utf32 = Enconding.UTF32; 
byte[] utf8Bytes = utf8.GetBytes(yourText); 
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes); 
string utf32Text = iso.GetString(utf32Text); 
+0

Tengo: D, acabo de editar la pregunta.Además, en realidad no importaría de todos modos, ya que cualquier carácter UTF-32 se puede expresar en UTF-8 o cualquier codificación Unicode para ese caso. AFAIK, de todos modos. – AStupidNoob

+0

@AStupidNoob Acabo de leer su respuesta actualizada y sus comentarios. Si sabe qué codificación es el archivo leído y es distinto de UTF32, debe leerlo en su codificación original y convertirlo al que desee antes de escribirlo. – Dummy01

+0

Gracias por su ayuda nuevamente. Probé tu sugerencia, pero no pude hacerlo funcionar D :. Además, pensé que todo el propósito de StringReaders y StringWriters era convertir las codificaciones. Quizás no entonces. – AStupidNoob

1

yo probamos este y funciona bien en mi PC.

System.IO.StreamReader streamReader = new System.IO.StreamReader("input", true); 
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("output", false); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

Tal vez el texto que piensa es en UTF32 es no.

+0

¿Estás usando Visual Studio/Windows? Puede ser solo mono si no. Probaré otros programas para asegurarme de que efectivamente es UTF32, ciertamente se ve como en un editor hexadecimal ... – AStupidNoob

+0

Ok, buena suerte. Pero tu código también produjo una salida incorrecta en mi PC. –

+1

Oh, lo siento, no noté el cambio en su código. En otras noticias, el uso de Visual Studio 2012 beta dio como resultado la salida correcta con mi código ... – AStupidNoob

0

Desde la sección Comentarios de MSDN para StreamReader's constructor:

Este constructor inicializa la codificación especificado por el parámetro de codificación , y el tamaño del buffer interno a 1024 bytes. El objeto StreamReader intenta detectar la codificación mirando primeros tres bytes de la secuencia. Reconoce automáticamente UTF-8, little-endian Unicode y big-endian texto Unicode si el archivo comienza con las marcas de orden de bytes apropiadas. De lo contrario, se utiliza la codificación proporcionada por el usuario. Consulte el método Encoding.GetPreamble para obtener más información sobre .

Es muy probable que las marcas de orden de bytes al principio de su archivo realmente indiquen UTF 16 (o algo así), y por lo tanto no está utilizando su codificación UTF 32 explícitamente establecida.

+0

Claro que por qué no, intentaré usar algunos otros programas para asegurarme de obtener la lista de materiales correcta. – AStupidNoob

+0

@AStupidNoob parece que hay una sobrecarga de constructor que no observará la lista de materiales agregando un parámetro booleano, podría intentarlo si no tiene otro programa a mano para verificar. – Tanzelax

+0

Correcto, habría pensado que al especificar la codificación habría asegurado que se usó, obviamente no en ese momento. Sin embargo, intenté usar Windows para esto y funcionó. Pero no pude verificar su salida UTF32 ya que no tengo ningún programa de Windows que funcione bien con UTF32, así que lo cambié a la salida en UTF8. – AStupidNoob