Shell   17-07-2022, 13:41
#1
Buenas!.

Un grupo de nombres de los archivo que aparecían en un ebook que tengo por aquí mostraba caracteres raros.
Las tildes. Decidí convertir el nombre a otros códigos de página, pero no parece un nombre de archivo con sentido al convertir el código de página. Sad

Adjunto el código del programa y el ejemplo para poder intentar solucionar el problema.
Utilizo para ello distintas codificaciones de página que me genera el comando iconv.

Código:
Private cuentafilas As Integer

Public Sub Form_Open()
 
  With grdTabla
    .Header = GridView.Both
    .Columns.Count = 3
    .Rows.Count = 0
    .Columns[0].Title = "Texto original"
    .Columns[0].W = 350
    .Columns[1].Title = "Codificación"
    .Columns[1].w = 150    
    .Columns[1].Alignment = Align.Center
    .Columns[2].Title = "Texto convertido a UTF-8"
    .Columns[2].W = 350
    .Columns[2].Alignment = Align.Center
  End With
 
End

Public Sub rellenarGridView(nombrefichero As String, datos As String[])
 
  Dim jc As String
  Dim conversion As String
 
  For Each jc In datos
    grdTabla.Rows.Count = cuentafilas + 1
    grdTabla[cuentafilas, 0].Alignment = Align.Left
    grdTabla[cuentafilas, 0].Text = nombrefichero
    grdTabla[cuentafilas, 1].Alignment = Align.Center
    grdTabla[cuentafilas, 1].Text = jc
    grdTabla[cuentafilas, 2].Alignment = Align.Center    
    Try conversion = Conv(nombrefichero, jc, "UTF-8")
    If Not IsNull(conversion) Then grdTabla[cuentafilas, 2].Text = conversion        
    If Error Then
      'No cuentes fila
      Continue
    Else
      cuentafilas += 1
    Endif    
  Next
  Label1.Text = "Total de conversiones: " & Str(cuentafilas + 1)
 
End

Public Sub Button1_Click()
 
  Dim archivo As String
  Dim juegodec As New String[]
  Dim tiposdecodificacion As String  
 
  'conv de gambas es un intermediario del comando iconv del sistema  
  'pasamos todos los códigos de página que existe a la variable
  Try Exec ["iconv", "--list"] To tiposdecodificacion
 
  'Copiado y pegado directamente el nombre del archivo en el editor de Gambas
  'No puedo pasar el archivo, ya que no tengo seguridad si es libre
  archivo = "Benito P‚rerz Gald¢s - Los Ayacuchos.epub"
 
  juegodec = Split(tiposdecodificacion, "\n", "//", True)    
  rellenarGridView(archivo, juegodec)
   
   'Esto salta siempre al final. No sé si es un error que viene del relleno del gridview
   'He tenido que anular su ejecución
  'If Error Then Message.Warning("No tienes instalado iconv en tu sistema!")
 
End

Si, la lista es larga. A ver si podéis ayudar con la manipulación de errores. Shy

Saludos
Archivos adjuntos
.gz
ConversionCodigoDePaginaNombreArchivo-0.0.1.tar.gz (Tamaño: 12.77 KB Descargas: 2)

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   17-07-2022, 15:44
#2
Así se muestra en el listado del comando ls:
Cita:Benito P'$'\302\202''rerz Gald¢s - Los Ayacuchos.epub

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shordi   17-07-2022, 19:23
#3
Lo primero que me ha llamado la atención es que dispone el sistema (al menos el mío) de 1.178 codificaciones y en el gridview sólo me aparecen 656. Así que he modificado tu código para que me salgan todos:
Código:
Private cuentafilas As Integer

Public Sub Form_Open()

  With grdTabla
    .Header = GridView.Both
    .Columns.Count = 3
    .Rows.Count = 0
    .Columns[0].Title = "Texto original"
    .Columns[0].Alignment = Align.Left
    .Columns[0].W = 350
    .Columns[1].Title = "Codificación"
    .Columns[1].w = 150
    .Columns[1].Alignment = Align.Center
    .Columns[2].Title = "Texto convertido a UTF-8"
    .Columns[2].W = 350
    .Columns[2].Alignment = Align.Center
  End With

End

Public Sub rellenarGridView(nombrefichero As String, datos As String[])

  Dim jc As String
  Dim conversion, s As String
  Dim n As Integer

  grdTabla.Rows.Count = datos.count
  For n = 0 To datos.max
    grdTabla[n, 0].Text = nombrefichero
    grdTabla[n, 1].Text = datos[n]
    Try conversion = Conv(nombrefichero, datos[n], "UTF-8")
    If Error Then
      conversion = Error.Text
    Else
      Inc cuentafilas
    Endif
    grdTabla[cuentafilas, 2].Text = conversion
  Next
  Label1.Text = "Total de conversiones: " & Str(cuentafilas + 1)

End

Public Sub Button1_Click()

  Dim archivo As String
  Dim juegodec As New String[]
  Dim tiposdecodificacion As String

  'conv de gambas es un intermediario del comando iconv del sistema
  'pasamos todos los códigos de página que existe a la variable
  Try Exec ["iconv", "--list"] To tiposdecodificacion

  'Copiado y pegado directamente el nombre del archivo en el editor de Gambas
  'No puedo pasar el archivo, ya que no tengo seguridad si es libre
  archivo = "Benito P‚rerz Gald¢s - Los Ayacuchos.epub"

  juegodec = Split(tiposdecodificacion, "\n", "//", True)
  rellenarGridView(archivo, juegodec)

  'Esto salta siempre al final. No sé si es un error que viene del relleno del gridview
  'He tenido que anular su ejecución
  'If Error Then Message.Warning("No tienes instalado iconv en tu sistema!")

End
Pero esto no soluciona el problema, sólo te indica qué conversiones generaron error y cuales generaron cadenas inimprimibles (las que están en blanco).
Creo que partes de un supuesto erróneo: El nombre de archivo responde a una codificación concreta. Creo que el nombre del archivo es el resultado de una conversión errónea, por lo que no tiene nada que ver con ninguna en concreto. Es decir, alguien lo creó con acentos, alguien se encontró con que no le salían y trató de convertirlos, con lo que convirtió un caracter extraño en otro caracter extraño distinto y ese segundo par de caracteres extraños es el que se quedó por no ser convertibles.
A mí pasó algo así hace mucho tiempo con un puñado de archivos .pdf importados de la red. Me volvieron loco y al final tuve que, simplemente, eliminar todo caracter extraño de los nombres de archivos. Mejor Benito Prez Galds que nada... o no.

Saludos
Última modificación: 17-07-2022, 19:23 por Shordi.

No podemos regresar
Shell   17-07-2022, 20:45
#4
Puedes hacerlo con un bucle for each. Wink
El row.count lo deje dentro para que solo contase las visibles.
 
(17-07-2022, 19:23)Shordi escribió: Lo primero que me ha llamado la atención es que dispone el sistema (al menos el mío) de 1.178 codificaciones y en el gridview sólo me aparecen 656. Así que he modificado tu código para que me salgan todos:

Si que tiene más, solo que me interesaban más las se pueden imprimir. Si no puedo verlas.
 
(17-07-2022, 19:23)Shordi escribió: Pero esto no soluciona el problema, sólo te indica qué conversiones generaron error y cuales generaron cadenas inimprimibles (las que están en blanco).

Más bien trata de mostrar la conversión directamente con todas las que sean imprimibles. Una vez vista, usar la más adecuada para el comando conv
de Gambas. Como no tengo ni la más remota idea de cual es el código de página.
 
(17-07-2022, 19:23)Shordi escribió: Creo que el nombre del archivo es el resultado de una conversión errónea, por lo que no tiene nada que ver con ninguna en concreto. Es decir, alguien lo creó con acentos, alguien se encontró con que no le salían y trató de convertirlos, con lo que convirtió un caracter extraño en otro caracter extraño distinto y ese segundo par de caracteres extraños es el que se quedó por no ser convertibles.

Vaya forma de hacerlo. Sad
 
(17-07-2022, 19:23)Shordi escribió: A mí pasó algo así hace mucho tiempo con un puñado de archivos .pdf importados de la red. Me volvieron loco y al final tuve que, simplemente, eliminar todo caracter extraño de los nombres de archivos. Mejor Benito Prez Galds que nada... o no.

No tiene por que ser siempre así, prueba a tener una máquina virtual de Windows para asegurarte.
Ahora te cuento el motivo. Al final he usado el archivo zip que contiene los autores de la A -> B

Te muestro una captura de "Engrampa" (un parte). Es el gestor de archivos que usa Linux Mint Mate.
Hice lo mismo con el comando "unzip  -l" y lo muestra igual.

[Imagen: mqbHJQ0.png]

Con Aristóteles igual.

Ahora arranco la máquina virtual que tengo por aquí de un viejo xp y ojo con el resultado.
Esta usando el compresor que tenía por defecto el xp.

[Imagen: mbNxUF1.png]

Aparece bien las tildes. De alguna forma se ve en Windows. No debe estar tan mal el archivo.

Saludos
Última modificación: 17-07-2022, 20:46 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   18-07-2022, 14:05
#5
Pc real: Linux
Pc virtual: Windows Xp.

(Eso de pc real y virtual se dice de otra forma), El host y la máquina invitada o algo así.

Activo el portapales compartido (usando la opción bidireccional) y arrastre en los menús ( igual, bidireccional) de la máquina virtual, del menú dispositivos.
Desde el explorador de Windows arrastro al explorador de Linux el directorio que contiene los archivos de Pérez Galdós.

[Imagen: 8AfmIkG.png]

Esto seguramente se podrá hacer de alguna forma desde Linux directamente.
Partiendo del zip incluso donde se encuentran los libros, o con un solo archivo.

Lo cierto es que el comando unzip incorpora la opción
 
Cita: 
 -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives

Y además:
-U  use escapes for all non-ASCII Unicode 
-UU ignore any Unicode fields

Suelo encontrarme la resolución del problema con más facilidad con los archivos de texto. Eso incluso se puede abrir con un editor como SublimeText y convertirlo.
Como nota curiosa los archivos de Python ( que no es más que un archivo de texto) "solían" llevar en su parte superior, si era UTF-8 u otro. Entonces si no usabas
la instrucción adecuada para esto y su codificación de página, no se podía usar las tildes y la eñe. Pero parece que los editores modernos se lo saltan de alguna forma.
Eso no quiere decir que luego en otro editor de programación pueda ocurrir el problema.

Cosas de la codificación de los caracteres.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.