13 Stimmen

FileSystemObject - Lesen von Unicode-Dateien

Klassischer ASP-, VBScript-Kontext.

Eine Vielzahl von Artikeln, darunter diese Microsoft-Version , sagen Sie kann nicht FileSystemObject verwenden, um Unicode-Dateien zu lesen.

Ich bin vor einiger Zeit auf dieses Problem gestoßen und habe daher stattdessen ADODB.Stream verwendet, wie im ReadText-Beispiel beschrieben これ anstelle von FileSystemObject.OpenTextFile (das zwar einen letzten Parameter akzeptiert, der angibt, ob die Datei als Unicode geöffnet werden soll, aber eigentlich nicht funktioniert).

Allerdings führt ADODB.Stream zu einer Welt der Schmerzen, wenn man versucht, eine Datei auf einem UNC-Fileshare zu lesen (Problem mit den Berechtigungen). Bei der Untersuchung dieses Problems bin ich über den folgenden Ansatz gestolpert, der a) mit Unicode-Dateien und b) über UNC-Fileshares funktioniert:

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

Dies ist die Verwendung des BFS, um eine Unicode-Datei ohne offensichtliche Probleme zu lesen, so dass ich verwirrt bin, wie alle Verweise, einschließlich MS, sagen Sie können nicht die BFS verwenden, um Unicode-Dateien zu lesen.

Hat schon jemand diesen Ansatz zum Lesen von Unicode-Dateien verwendet? Gibt es irgendwelche versteckten Probleme, die ich übersehe, oder kann man tatsächlich Unicode-Dateien mit FSO lesen?

12voto

Tao Punkte 12833

Ich glaube, MS gibt nicht offiziell an, dass es Unicode unterstützt, weil:

  1. Es erkennt keine Unicode-Dateien, die die Byte-Order-Marke am Anfang der Datei verwenden, und
  2. Es unterstützt nur Little-Endian UTF-16 Unicode-Dateien (und Sie müssen die Byte Order Mark entfernen, falls vorhanden).

Hier ist ein Beispielcode, den ich (seit einigen Jahren) erfolgreich verwende, um Unicode-Dateien mit FSO automatisch zu erkennen und zu lesen (vorausgesetzt, sie sind Little-Endian und enthalten die BOM):

'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

4voto

AnthonyWJones Punkte 182582

Ja, diese Unterlagen sind veraltet. Die Skripting-Komponente hat in ihren Anfängen eine Reihe von Änderungen durchlaufen (einige davon waren brechende Änderungen, wenn Sie frühe Bindungen verwendet haben), aber mindestens seit WK2000 SP4 und XP SP2 ist sie sehr stabil.

Seien Sie nur vorsichtig, was Sie mit Unicode meinen. Manchmal wird das Wort Unicode im weiteren Sinne verwendet und kann jede Kodierung von Unicode umfassen. FSO liest zum Beispiel keine UTF8-Kodierungen von Unicode. Hierfür müssten Sie auf ADODB.Stream zurückgreifen.

4voto

Daumantas Punkte 41
'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
 '.
 '.

0voto

Tor Haugen Punkte 19063

Ich würde sagen, wenn es funktioniert, benutze es ;-)

Ich stelle fest, dass der MS-Artikel, auf den Sie sich beziehen, aus dem Windows 2000 (!) Skripting Guide stammt. Vielleicht ist er veraltet.

0voto

Alexanderius Punkte 792

Ich schreibe ein Windows 7-Gadget und stoße auf das gleiche Problem. Wenn es möglich ist, können Sie Ihre Dateien einfach in eine andere Kodierung umwandeln, zum Beispiel: ANSI-Kodierung "Windows-1251". Mit dieser Kodierung funktioniert es gut.

Wenn Sie dies zum Schreiben einer Website verwenden, sollten Sie besser einen anderen Entwicklungsansatz verwenden und diese Objekte vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X