• Domingo 5 de Mayo de 2024, 16:19

Autor Tema:  Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt  (Leído 2504 veces)

ProgramadorVB

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
0
Hola amigos, muy buenos días.

Porque es posible que algunos de ustedes ya lo hallan visto... abro este post, para ver si me puede ayudar.

Necesito crear (con vb6) archivos en cualquier idioma...
Por ejemplo, necesito poder crear un archivo con este nombre...

C:ごはぁ~ん.txt

es un ejemplo, podría necesitar crearlo en ruso, o en inglés, pero con inglés no es el problema... el problema es para los caracteres "raros"...

Necesito usar por ejemplo OPEN para crear archivos...
¿Cómo hacer esto? ¿Que API usar?


Espero que me puedan ayudar y seguramente también servirá para otro...

Un saludo y gracias de antemano.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #1 en: Viernes 21 de Mayo de 2010, 18:50 »
0
Esto depende del idioma instalado en la máquina. Según el idioma instalado en la máquina se utiliza el conjunto de caracteres en ese idioma.

Adicionalmente pudera necesitarse usar en ocasiones la función strconv, por ejemplo para las conversiones de 'Kanji'.

Es indispensable en cualquier caso que la instalación del S.O. tenga activado (cuando se instaló el S.O.)  'escritura compleja', lo que se refleja en ese servicio 'inabortable' llamado 'CtfMon.exe'

Desde luego no vas poder crear carpetas con caracteres cirílicos en ordenador cuya instalación es en caracteres oocidentales, después de todo los caracteres no son más que imágenes, representaciones gráficas de un valor numérico. Toda la info del sistema (nombre de carpetas, botones cerrar, maximizar,etc...) se representan exclusivamente con la grafía instalada. sin embargo nada te impide crear el contenido de un txt con la grafía que quieras, para ello sólo necesitas indicar la fuente requerida.

Cuando se coinstalan 2 idiomas en un equipo, tampoco, la coinstalación suele referirse exclusivamente al reparto de las teclas sobre el teclado y por tanto tener disponibles ciertos caracteres sin usar combinaciones.

Por último te recuerdo que los nombres de archivos y carpetas está delimitado a un conjunto de caracteres específico, para probarlo crea un archivo e intenta meter un asterisco en medio del nombre...
«Ma non troppo»
----> ModoVacaciones = False<----

ProgramadorVB

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #2 en: Viernes 21 de Mayo de 2010, 19:58 »
0
Hola,

Gracias por la respuesta...

Todos eso lo tengo en cuenta y aporta, pero aún necesito una solución...

Te comento... les comento algo...
Cuando descargo un programa, un archivo de música o cualquier archivo... por ejemplo... con el gestor de descargas IDM... descarga el archivo respetando el nombre... o sea... si descargo un MP3 en japonés, por ejemplo "音楽.mp3"... se guarda en mi PC un archivo con igual nombre... por ejemplo: "C:音楽.mp3"

A esto es a lo que me refiero...
Necesito poder crear desde visualbasic 6, un archivo (cualquiera para empezar) con nombres como éste...

¿Alguien sabe que API o método usar para crear archivos así?
De verdad necesito una solución, aparte, esto seguramente le servirá a otra persona... en el futuro

Espero que con la ayuda de la comunidad... encuentre la solución

GRacias!!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #3 en: Domingo 23 de Mayo de 2010, 01:13 »
0
Creo que me he explicado bien...

El archivo se te descarga con el nombre original, pero cuando se guarda los caracteres (la grafía) son truncados, tu no verás esos caracteres en tu equipo que está en idioma español, pero el nombre correcto está ahí.

Sea el nombre de un archivo tal que éste: [香港][林正英][经典系列][洪福齐天].mpg
Tu verás algo como esto:

Tu en VB no podrás recibir una cadena de texto, sino una matriz de bytes y como tal puedes tratarla (ten en cuenta que lo más probable es que use 2 bytes por carácter), lo que no podrás hacer NUNCA es que se vea la GRAFIA original si no coincide con la GRAFÍA del idioma que está instalado en tu equipo, sin embargo el nombre es creado...

Un equipo sólo acepta una grafía a la vez, la que corresponde al idioma instalado (panel de control,configuración regional y de idioma)  . Los nombres de archivos y de carpetas se guardan pero los caracteres que te aparecerán será como el dibujo, ilegible excepto para quien tenga dicho idioma puesto en su idioma.

VB opera con Unicode, pero de cada adentro lo 'traduce' a ANSI, lo que resulta en un truncado que puede inutilizar los datos. Por ello hay que actuar sabiendo lo que se hace.

De entrada si tu aplicación debe mostrar una interfaz, por ejemplo en chino, debes cargar un conjunto de controles que en vez de ANSI utilicen realmente Unicode, estos controles son controles comunes, si miras en componentes localiza Microsoft forms2  y márcalo. Los controles que provee si permiten unicode, ahora por ejemplo cuando cargues un textbox, cambia la fuente a un tipo de grafía china, por ejemplo 'Ming Liu'.

Luego tu problema de abrir un fichero lo podemos resolver con la API CreateFile, pero no la normal sino la 'wide', yo te pongo una de ejemplo, con los parámetros, la declaración de los parámetros y un valor de ejemplo:
Código: Visual Basic
  1.  
  2. Private Declare Function CrearFichero Lib "kernel32" Alias "CreateFileW" (ByVal Ruta As String, ByVal ModoAcceso As Long, ByVal ModeCompartido As Long, byref AttributosSeguridad As AtributosDeSeguridad, ByVal Modoapertura As AccionFichero, ByVal AtributosYBanderas As Long, ByVal Plantilla As Long) As Long
  3.  
  4. Private Type AtributosDeSeguridad
  5.     Tamaño As Long       ' tamaño en bytes de la estructura 10
  6.     Descriptor As Long      ' puntero a un descriptor que controla la compartición del uso del fichero. 0 = se asigna por defecto al proceso que lo llama.
  7.     Heredable As Boolean    ' indica si un nuevo proceso (cuando se crea) hereda el manejador (handle)
  8. End Type
  9.  
  10. Dim AtSeg as AtributosDeSeguridad ' declaración para esta opción
  11. AtSeg.Tamaño= 10   ' la estructura puede pasarse vacía sin problemas...
  12.  
  13. Private Enum AccionFichero
  14.     ACCION_CREAR_NUEVO = 1              ' Crea un nuevo fichero, si existe ya, falla
  15.     ACCION_CREAR_SIEMPRE = 2            ' Crea un nuevo fichero, si existe es sobrescrito.
  16.     ACCION_ABRIR_SOLO_SI_EXISTE = 3     ' Abre un fichero, si no existe falla.
  17.     ACCION_ABRIR_SIEMPRE = 4            ' Abre un fichero, si no existe se crea
  18.     ACCION_TRUNCAR_SOLO_SI_EXISTE = 5   '  abre un fichero y lo sobrescribe (borra su contenido), si no existe falla (debe abrirse para escritura obligatoriamente,  para lectura es opcional...
  19. End Enum
  20.  
  21. dim ModoAp as AccionFichero      ' declaración para esta opción
  22. ModoAp  = ACCION_ABRIR_SIEMPRE   ' ejemplo de valor
  23.  
  24.  

 
Es im portante saber que un fichero abierto con CreateFile debe ser cerrado con CloseHandle, de lo contrario el fichero quedará 'pillado'...
Código: Visual Basic
  1.  
  2. dim ff as long
  3.  
  4. ' si falla devuelve -1.
  5. ff = Crearfichero(..., ..., ...)
  6.  
  7. if ff <> -1 then
  8.      ff = CloseHandle(ff) ' si tiene éxito devuelve 1, si falla devuelve 0
  9. end if
  10.  
  11.  

Un ejemplo para crear un fichero...
Código: Visual Basic
  1.  
  2. public function Crear as long
  3.        Dim b() As Byte
  4.        Dim ff As Long
  5.        Dim RutaFichero as string
  6.        Dim fa As VbFileAttribute  ' atributos para el fichero
  7.        Dim AtSeg as AtributosDeSeguridad
  8.        Dim ModoAp as AccionFichero      
  9.    
  10.         Const  ACCESO_MODO_ESCRITURA = 2 ^ 30
  11.         const  COMPARTIR_MODO_ESCRITURA = 2
  12.        const   BANDERA_ACCESO_ALEATORIO = 268435456
  13.  
  14.        ModoAp  = ACCION_ABRIR_SIEMPRE  
  15.        fa = vbNormal  ' atributo normal , ¿ 128 ?
  16.        ReDim b(0 To 19)
  17.        b(0) = &H39: b(1) = &H4E: b(2) = &H39: b(3) = &H4E: b(4) = &H39: b(5) = &H4E: b(6) = &H39: b(7) = &H4E
  18.        b(8) = &H39: b(9) = &H4E: b(10) = &H39: b(11) = &H4E
  19.        b(12) = 0: b(13) = 46: b(14) = 0: b(15) = 84: b(16) = 0: b(17) = 88: b(18) = 0: b(19) = 84
  20.  
  21.        RutaFichero = b
  22.        ff = CrearFichero(RutaFichero, ACCESO_MODO_ESCRITURA , COMPARTIR_MODO_ESCRITURA , AtSeg, ModoAp , fa + BANDERA_ACCESO_ALEATORIO , 0)
  23.      
  24.       Crear = ff
  25.       ' if ff <> -1 then
  26.       '        Msgbox "el fichero ha sido  abierto/creado... verifícalo en la carpeta de tu proyecto"
  27.       '       ff = closeHandle(ff)
  28.       '       if ff = 1 then
  29.       '               msgbox "El fichero ha sido cerrado.."          
  30.       '       end if
  31.       ' end if
  32.  
  33. end function
  34.  
  35.  
NOTA: Si posas el cursor sobre la variable Rutafichero verás que muestra ????????... porque al volcar al intellisense, traduce a ANSI su contenido, pero en memoria están los bytes correctamente.

Se crea un fichero con este nombre: 㩃停橩浡獡琮瑸 sin embargo la grafía resulta ilegible como ya te he explicado.
No me preguntes el significado, no entiendo el chino, es sólo un ejemplo.

Tendrás que usar Readfile y Writefile para manejar el contendo.
«Ma non troppo»
----> ModoVacaciones = False<----

ProgramadorVB

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #4 en: Domingo 23 de Mayo de 2010, 06:17 »
0
GRACIAS, PROBLEMA RESUELTO...

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #5 en: Martes 25 de Mayo de 2010, 04:51 »
0
Pués me alegro, porque iba a decirte que mi tiempo no da para repasar los proyectos de la gente... puedo atender dudas puntuales...

Sobre windows Form2, quizás entendiste mal. Te decía que se deben utilizar si TU INTERFAZ tiene que mostrar caracteres unicode, pero éste no es tu caso, después de leerte...
«Ma non troppo»
----> ModoVacaciones = False<----

ProgramadorVB

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
« Respuesta #6 en: Martes 25 de Mayo de 2010, 06:59 »
0
Hola nuevamente,

Sí te entiendo... por eso seguí revisando y buscando la solución por mi cuenta, hasta que la encontré... te agradezco por tu ayuda que sirvió para entender algunas cosas.

Además... en este caso estaba necesitando (primero) crear un nombre de archivo Unicode... y por este caso puntual abrí el post... pero también es mi caso la interfaz (desde ahora)... pero para esto, ya se que debo usar el "forms2"... ya que es todo lo que necesito... en definitiva...

Gracias por la comprensión y paciencia...
 :beer:  Un saludo y felicidades.