Curiosidad sobre los streams y los encodings

12/09/2004 - 19:43 por Zephryn Xirdal | Informe spam
Hola de nuevo, y de nuevo con mi zxFortunes.

He conseguido poder leer bien de un archivo de texto (esto es que me leyera
las letras acentuadas y que la posición se corresponda con la real dentro
del texto) mediante una lectura con el encoding de UTF7.

Pero entonces, los textos en inglés no se corresponde lo leído con la
posición dentro del texto. En los textos en ingés se leen con UTF8 o ASCII,
pero entonces los que están en castellano se leen mal.

El código es este:
for(int i=0;i<this.m_numFortuneFiles;i++)

{

System.Text.Encoding enc=System.Text.Encoding.ASCII;

FileStream fsRead=new FileStream(m_fortuneFiles[i],FileMode.Open);

BinaryReader br=new BinaryReader(fsRead,enc);

nPosInFile=0;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

for(;nPosInFile<=fsRead.Length;nPosInFile++)

{

//Parece ser que hay veces que se llega al final del archivo sin haber leído
fsRead.Length caracteres

try

{

ch=br.ReadChar();

}

catch(EndOfStreamException)

{

nPosInFile=(int)fsRead.Length;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

ch=' ';

}

//Si es un final

if(ch=='%')

{

//idx.nPosInFile=(int)sr.BaseStream.Position;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

}

}

br.Close();

fsRead.Close();

}

Como veréis el encoding con el que leo es el ASCII (que parece que funciona,
aunque en lugar de leer letras con acentos lee cosas raras, pero al menos se
corresponden con lo que quiero (me resulta muy curioso, porque cuando lo
probé hace unos días símplemente se saltaba las letras acentuadas, y ahora
no, quizás se deba al sp1 del net 1.1, o a algo que hacía mal).

Lo curioso es que luego, para leer el texto del fichero (leerlo y
transformarlo), lo hago con UTF7 y se lee bien y en su sitio.

Me gustaría que alguien pudiera explicarme el motivo de este galimatías, o
que ne direccione a una página donde se explique, porque la verdad,
funcionar funciona, pero no sé cómo.

Gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Jose Alfredo
12/09/2004 - 22:09 | Informe spam
Hola!

Te debe leer bien los textos español en UTF-8 también (yo lo tengo así),
claro todo depende de que encoding tengas los archivos de texto, y ahí debe
estar el problema. Fijate que el mismo notepad puedo codificar en ascii
utf-8 y big endian,
Lo que no se como se hace, es como reconocer la codificación desde el
programa. Eso seria bueno cuando uno lee ficheros foraneos, si te enteras de
algo avisanos..

Saludos

Jose Alfredo




"Zephryn Xirdal" schrieb im
Newsbeitrag news:e%
Hola de nuevo, y de nuevo con mi zxFortunes.

He conseguido poder leer bien de un archivo de texto (esto es que me


leyera
las letras acentuadas y que la posición se corresponda con la real dentro
del texto) mediante una lectura con el encoding de UTF7.

Pero entonces, los textos en inglés no se corresponde lo leído con la
posición dentro del texto. En los textos en ingés se leen con UTF8 o


ASCII,
pero entonces los que están en castellano se leen mal.

El código es este:
for(int i=0;i<this.m_numFortuneFiles;i++)

{

System.Text.Encoding enc=System.Text.Encoding.ASCII;

FileStream fsRead=new FileStream(m_fortuneFiles[i],FileMode.Open);

BinaryReader br=new BinaryReader(fsRead,enc);

nPosInFile=0;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

for(;nPosInFile<=fsRead.Length;nPosInFile++)

{

//Parece ser que hay veces que se llega al final del archivo sin haber


leído
fsRead.Length caracteres

try

{

ch=br.ReadChar();

}

catch(EndOfStreamException)

{

nPosInFile=(int)fsRead.Length;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

ch=' ';

}

//Si es un final

if(ch=='%')

{

//idx.nPosInFile=(int)sr.BaseStream.Position;

bw.Write(i);

bw.Write(nPosInFile);

m_numFortunes++;

}

}

br.Close();

fsRead.Close();

}

Como veréis el encoding con el que leo es el ASCII (que parece que


funciona,
aunque en lugar de leer letras con acentos lee cosas raras, pero al menos


se
corresponden con lo que quiero (me resulta muy curioso, porque cuando lo
probé hace unos días símplemente se saltaba las letras acentuadas, y ahora
no, quizás se deba al sp1 del net 1.1, o a algo que hacía mal).

Lo curioso es que luego, para leer el texto del fichero (leerlo y
transformarlo), lo hago con UTF7 y se lee bien y en su sitio.

Me gustaría que alguien pudiera explicarme el motivo de este galimatías, o
que ne direccione a una página donde se explique, porque la verdad,
funcionar funciona, pero no sé cómo.

Gracias de antemano.






Respuesta Responder a este mensaje
#2 Zephryn Xirdal
12/09/2004 - 22:15 | Informe spam
"Jose Alfredo" escribió en el mensaje
news:
Hola!

Te debe leer bien los textos español en UTF-8 también (yo lo tengo así),
claro todo depende de que encoding tengas los archivos de texto, y ahí
debe
estar el problema. Fijate que el mismo notepad puedo codificar en ascii
utf-8 y big endian,
Lo que no se como se hace, es como reconocer la codificación desde el
programa. Eso seria bueno cuando uno lee ficheros foraneos, si te enteras
de
algo avisanos..

Saludos

Jose Alfredo



Pues son ficheros de texto provenientes del mundo de linux. Unos llevan
salto de línea/retorno de carro y otros no, y la verdad es que es un
proyecto ya hecho en otro lenguaje/entorno que estoy haciendo con el c# para
aprender... Y con el otro entorno no tengo ningún problema en leerlos...

Supongo que abriendo el fichero y comenzando a leer en un encoding, se mira
a ver si son caracteres ascii normales y si hay raros dentro. Si es todo
basura, pues cambia de encoding hasta que leas las cosas sin símbolos ascii
raros y debería funcionar...

Como esto es un proyecto de estar por casa... voy a intentar hacer un
"reconocedor de encodings" a ver qué pasa, y de paso cambio todo el formato
de mi programa.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida