Programación General > Visual Basic 6.0 e inferiores
Crear nombre de archivo, en cualquier idioma. Ej: ごはぁ~ん.txt
ProgramadorVB:
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:
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...
ProgramadorVB:
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:
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 --- 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 Private Type AtributosDeSeguridad Tamaño As Long ' tamaño en bytes de la estructura 10 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. Heredable As Boolean ' indica si un nuevo proceso (cuando se crea) hereda el manejador (handle)End Type Dim AtSeg as AtributosDeSeguridad ' declaración para esta opciónAtSeg.Tamaño= 10 ' la estructura puede pasarse vacía sin problemas... Private Enum AccionFichero ACCION_CREAR_NUEVO = 1 ' Crea un nuevo fichero, si existe ya, falla ACCION_CREAR_SIEMPRE = 2 ' Crea un nuevo fichero, si existe es sobrescrito. ACCION_ABRIR_SOLO_SI_EXISTE = 3 ' Abre un fichero, si no existe falla. ACCION_ABRIR_SIEMPRE = 4 ' Abre un fichero, si no existe se crea 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...End Enum dim ModoAp as AccionFichero ' declaración para esta opciónModoAp = ACCION_ABRIR_SIEMPRE ' ejemplo de valor
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 --- dim ff as long ' si falla devuelve -1.ff = Crearfichero(..., ..., ...) if ff <> -1 then ff = CloseHandle(ff) ' si tiene éxito devuelve 1, si falla devuelve 0end if
Un ejemplo para crear un fichero...
--- Código: Visual Basic --- public function Crear as long Dim b() As Byte Dim ff As Long Dim RutaFichero as string Dim fa As VbFileAttribute ' atributos para el fichero Dim AtSeg as AtributosDeSeguridad Dim ModoAp as AccionFichero Const ACCESO_MODO_ESCRITURA = 2 ^ 30 const COMPARTIR_MODO_ESCRITURA = 2 const BANDERA_ACCESO_ALEATORIO = 268435456 ModoAp = ACCION_ABRIR_SIEMPRE fa = vbNormal ' atributo normal , ¿ 128 ? ReDim b(0 To 19) b(0) = &H39: b(1) = &H4E: b(2) = &H39: b(3) = &H4E: b(4) = &H39: b(5) = &H4E: b(6) = &H39: b(7) = &H4E b(8) = &H39: b(9) = &H4E: b(10) = &H39: b(11) = &H4E b(12) = 0: b(13) = 46: b(14) = 0: b(15) = 84: b(16) = 0: b(17) = 88: b(18) = 0: b(19) = 84 RutaFichero = b ff = CrearFichero(RutaFichero, ACCESO_MODO_ESCRITURA , COMPARTIR_MODO_ESCRITURA , AtSeg, ModoAp , fa + BANDERA_ACCESO_ALEATORIO , 0) Crear = ff ' if ff <> -1 then ' Msgbox "el fichero ha sido abierto/creado... verifícalo en la carpeta de tu proyecto" ' ff = closeHandle(ff) ' if ff = 1 then ' msgbox "El fichero ha sido cerrado.." ' end if ' end if end function 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.
ProgramadorVB:
GRACIAS, PROBLEMA RESUELTO...
Navegación
[#] Página Siguiente
Ir a la versión completa