2009-09-11 27 views
8

ASP clásico, contexto de VBScript.FileSystemObject - Lectura de archivos Unicode

Muchos artículos incluyendo this Microsoft one, dicen que no pueden usar FileSystemObject para leer archivos Unicode.

me encontré con este problema hace un tiempo, por lo pasado a utilizar ADODB.Stream lugar, por el ejemplo ReadText here, en lugar de utilizar FileSystemObject.OpenTextFile (que sí acepta un parámetro final que indica si se debe abrir el archivo como Unicode, pero en realidad doesn no funciona).

Sin embargo, ADODB.Stream resulta un mundo de dolor al intentar leer un archivo en un archivo compartido UNC (problema relacionado con permisos). Por lo tanto, la investigación de esto, me encontré con el enfoque siguiente, que funciona a) con archivos Unicode, y b) a través de UNC archivos compartidos:

dim fso, file, stream 
set fso = Server.CreateObject("Scripting.FileSystemObject") 
set file = fso.GetFile("\\SomeServer\Somefile.txt") 
set stream = file.OpenAsTextStream(ForReading,-1) '-1 = unicode 

Se trata de utilizar el FOE para leer un archivo Unicode sin ningún problema aparente, por lo que Estoy confundido en cuanto a todas las referencias, incluida MS, diciendo que no puede usar el FSO para leer archivos Unicode.

¿Alguien más ha usado este enfoque para leer archivos Unicode? ¿Hay algún problema oculto que me falta, o realmente puedes leer archivos Unicode usando FSO?

Respuesta

3

Sí, la documentación no está actualizada. El componente de secuencias de comandos pasó por un conjunto de cambios en sus inicios (algunos de ellos fueron cambios de última hora si estaba utilizando el enlace anticipado), sin embargo, desde al menos WK2000 SP4 y XP SP2 ha sido muy estable.

Solo tenga cuidado con lo que quiere decir con unicode. A veces, la palabra Unicode se usa de manera más amplia y puede abarcar cualquier codificación de Unicode. FSO no lee, por ejemplo, codificaciones UTF8 de Unicode. Para eso necesitarías recurrir a ADODB.Stream.

+0

Gracias.En este caso, los archivos que se leen como "unicode" son todos creados por código similar que usa FSO.OpenTextFile (con TriStateTrue para "unicode") para abrir el archivo y escribir en él, por lo que debe ser seguro seguir con FSO para leerlos todas. ADODB.Stream causa todo tipo de problemas cuando se intenta leer de una aplicación de archivos en otra máquina y por eso me estoy alejando de eso. – AdaTheDev

0

Yo diría que si funciona, lo utilizan ;-)

noto el artículo de MS que se refieren a es desde el 2000 (!) Guía de secuencias de comandos de Windows. Tal vez es obsoleto.

6

Creo que MS no declara oficialmente que soporta Unicode porque:

  1. No detecta archivos Unicode utilizando la marca de orden de bytes al comienzo del archivo, y
  2. Sólo se apoya pequeño -Endian UTF-16 archivos Unicode (y debe eliminar la marca de orden de bytes, si está presente).

Aquí hay un código de ejemplo que he utilizado con éxito (durante unos años) para detectar automáticamente y leer archivos Unicode con FSO (suponiendo que son ascendente hacia la izquierda y contienen la lista de materiales):

'Detect Unicode Files 
Set Stream = FSO.OpenTextFile(ScriptFolderObject.Path & "\" & FileName, 1, False) 
intAsc1Chr = Asc(Stream.Read(1)) 
intAsc2Chr = Asc(Stream.Read(1)) 
Stream.Close 
If intAsc1Chr = 255 And intAsc2Chr = 254 Then 
    OpenAsUnicode = True 
Else 
    OpenAsUnicode = False 
End If 

'Get script content 
Set Stream = FSO.OpenTextFile(ScriptFolderObject.Path & "\" & FileName, 1, 0, OpenAsUnicode) 
TextContent = Stream.ReadAll() 
Stream.Close 
0

Estoy escribiendo un gadget de Windows 7 y me encuentro con el mismo problema, y ​​si es posible, puede simplemente cambiar sus archivos a otra codificación, por ejemplo: codificación ANSI "windows-1251". Con esta codificación, funciona bien.

Si está utilizando esto para escribir un sitio, será mejor usar otro enfoque de desarrollo para evitar estos objetos.

4
'assume we have detected that it is Unicode file - then very straightforward 
'byte-by-byte crawling sorted out my problem: 
'. 
'. 
'. 
else 
    eilute=f.ReadAll 
    'response.write("&#268;IA BUVO &#268;ARLIS<br/>") 
    'response.write(len(eilute)) 
    'response.write("<br/>") 
    elt="" 
    smbl="" 
    for i=3 to len(eilute) 'First 2 bytes are 255 and 254 
    baitas=asc(mid(eilute,i,1)) 
    if (i+1) <= len(eilute) then 
     i=i+1 
    else 
    exit for 
    end if 
    antras=asc(mid(eilute,i,1))*256 ' raidems uzteks 
    'response.write(baitas) 
    'response.write(asc(mid(eilute,i,1))) 
    'response.write("<br/>") 
    if baitas=13 and antras=0 then 'LineFeed 
     response.write(elt) 
     response.write("<br/>") 
     elt="" 
     if (i+2) <= len(eilute) then i=i+2 'persokam per CarriageReturn 
    else 
     skaicius=antras+baitas 
     smbl="&#" & skaicius & ";" 
     elt=elt & smbl 
    end if 
    next 
    if elt<>"" then 
    response.write(elt) 
    response.write("<br/>") 
    elt="" 
    end if 
    end if 
f.Close 
'. 
'.