Simbolos raros Ñ o tildes o ¿ en richbox C#

Iniciado por SrTrp, 15 Octubre 2018, 01:34 AM

0 Miembros y 1 Visitante están viendo este tema.

SrTrp

Tengo un problema que cuando cargo un archivo txt y y lo muestro en un richbox me muestran unos símbolos raros ya que unas palabras estan tildadas o con el signo ¿ de pregunta, hay alguna forma de solucionar esto?

Eleкtro

#1
Cita de: SrTrp en 15 Octubre 2018, 01:34 AM
Tengo un problema que cuando cargo un archivo txt y y lo muestro en un richbox me muestran unos símbolos raros ya que unas palabras estan tildadas o con el signo ¿ de pregunta, hay alguna forma de solucionar esto?


La aparición de símbolos de interrogación siempre es un signo que evidencia un problema de decodificación de caracteres. Muestra cómo estás obteniendo el texto de ese archivo. Basicamente para solucionarlo debes comprobar/conocer la codificación de texto del archivo de texto y usar esa misma codificación en la (sobrecarga de la) función que estés utilizando para obtener el texto.

Saludos








SrTrp

Obtengo el archivo de texto así
Código (csharp) [Seleccionar]

string a = string.Empty;
            OpenFileDialog o = new OpenFileDialog();
            if (o.ShowDialog() == DialogResult.OK)
            {
                a = o.FileName;
                StreamReader sr = new StreamReader(a);
                string t = "";
                ArrayList arr = new ArrayList();

                while (t != null)
                {
                    t = sr.ReadLine();
                    if (t != null)
                    {
                        arr.Add(t);
                    }
                }
                sr.Close();
int rf = 0;
foreach (string op in arr)
                {
                        arreglo[rf] = op;
                        rf++;
                }

Luego al arreglo lo mando a otro arreglo de otra clase, y para imprimir el texto lo hago así:
Código (csharp) [Seleccionar]

Form3 hhh = new Form3 (this);
                hhh .Show();
                hhh .richTextBox1.Text = arreglo2[0];

el archivo de texto tiene algo así:

¿Hola?
Esta es una oración

y así es como hago todo esto para obtener el texto como podría codificarlo.

Eleкtro

#3
Modifica tu código de la siguiente manera:

Código (csharp) [Seleccionar]
...
Encoding enc = System.Text.Encoding.TIPO_DE_CODIFICACIÓN;
...
StreamReader sr = new StreamReader(a, enc);
...


Nota: cómo es lógico, debes asegurarte de especificar la misma codificación de texto que tenga ese archivo de texto, no puedes especificar cualquier codificación aleatoria por que entonces los caracteres se representarán mal (aunque no todos los caracteres, depende). Prueba con la codificación UTF8 al ser de la más común, y puesto que de seguro NO es la codificación System.Text.Encoding.Default (Windows-1252 por lo general si tienes Windows en Español), ya que esa es la codificación que se usa por defecto si no especificas arbitrariamente la codificación a usar, y ya has dejado claro que no te funciona bien esa codificación.

Pero déjame decirte una cosa, a menos que haya una razón en especial (educativa) por la que hayas decidido emplear una tediosa y tosca metodología ocupando 20 lineas, entonces te conviene borrar todo ese código y sencillamente realizar una llamada a la función System.IO.File.ReadLines:

Código (csharp) [Seleccionar]
IEnumerable<string> textLines = System.IO.File.ReadLines(ruta_de_archivo, codificación);




Código (csharp) [Seleccionar]
Luego al arreglo lo mando a otro arreglo de otra clase

Tienes dos clases, llamémosla clase "A" y clase "B", bien, pues a menos que exista un motivo suficientemente razonable, como por ejemplo deshechar/liberar la instancia de la clase "A", entonces no tiene mucho sentido crear un duplicado (o copiar, mejor dicho) un array de la clase "A" en la clase "B", puesto que el array ya es accesible por tu código de la clase "B" en la clase "A"... o al menos eso parece ser según lo que estás diciendo.

Además, si quieres "enviar" algo a otra clase, deberías envíarlo como argumento al constructor de dicha clase, ya sea este una clase de tipo Form, o de un tipo personalizado. Y en el caso de que la clase "B" no sea una clase instanciable, entonces no tiene sentido enviar/copiar nada puesto que como ya digo puedes acceder al objeto en la clase "A". No se me ocurre un escenario donde realmente sea necesario copiar los elementos de un array en esas circunstancias por lo poco que has descrito.

Saludos.








SrTrp

Intente ponerle la codificación pero sigue mostrando lo mismo en cuanto a lo de el IEnumerable hago las 20 lineas porque en el ciclo me la paso condicionando que si una linea empieza por ejemplo con "#" que haga algo distinto y así. :S