2009-09-11 18 views
8

Klasyczny ASP, kontekst VBScript.FileSystemObject - Odczytywanie plików Unicode

Wiele artykułów, w tym this Microsoft one, oznacza, że ​​nie może używać FileSystemObject do odczytywania plików Unicode.

I napotkał ten problem jakiś czas temu, więc włączony do korzystania ADODB.Stream zamian za przykład READTEXT here, zamiast korzystania FileSystemObject.OpenTextFile (który ma przyjąć ostateczną parametr wskazujący, czy otworzyć plik jako Unicode, ale w rzeczywistości nie robi nie działa).

Jednak ADODB.Stream powoduje ból podczas próby odczytu pliku w ramach udostępniania plików UNC (problem związany z uprawnieniami). Tak więc, badając to, natknąłem się na następujące podejście który pracuje a) z plikami Unicode, oraz b) w poprzek UNC udostępniane pliki:

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 

ten korzysta z FSO odczytać plik Unicode bez widocznego problemu, więc jest mylony co do wszystkich odniesień, w tym stwardnienia rozsianego, mówiąc, że nie możesz używać FSO do odczytywania plików Unicode.

Czy ktoś inny użył tego podejścia do odczytu plików Unicode? Czy są jakieś ukryte błędy, których mi brakuje, czy naprawdę potrafisz czytać pliki Unicode za pomocą FSO?

Odpowiedz

3

Taka dokumentacja jest nieaktualna. Składnik skryptowy przeszedł szereg zmian w swoim początkowym okresie (niektóre z nich łamały zmiany, jeśli używasz wczesnego wiązania), ale od co najmniej WK2000 SP4 i XP SP2 było bardzo stabilne.

Tylko uważaj, co masz na myśli przez Unicode. Czasami słowo unicode jest używane szerzej i może obejmować dowolne kodowanie unikodu. FSO nie odczytuje na przykład kodowania UTF8 w unicode. W tym celu musiałbyś wrócić do ADODB.Stream.

+0

Dzięki.W tym przypadku pliki odczytane jako "Unicode" są wszystkie tworzone przez podobny kod, który używa FSO.OpenTextFile (z TriStateTrue dla "Unicode"), aby otworzyć plik do zapisu do niego, więc powinno być bezpieczne trzymanie się FSO, aby je odczytać wszystko. ADODB.Stream powoduje wszelkiego rodzaju hoo-haa podczas próby odczytania z udostępniania plików na innym komputerze, dlatego od tego się oddalam. – AdaTheDev

0

Powiedziałbym, czy to działa, użyj go ;-)

zauważam artykuł MS Nazywasz jest od 2000 roku (!) Przewodnik skryptów Windows. Może to przestarzałe.

6

myślę MS nie oficjalnie stwierdzić, że obsługuje standard Unicode, ponieważ:

  1. To nie wykrywa plików Unicode przy użyciu znacznika kolejności bajtów na początku pliku, a
  2. tylko Wspiera Mała -Endyjskie pliki unicode UTF-16 (i musisz usunąć znacznik kolejności bajtów, jeśli jest obecny).

Oto przykładowy kod, że zostały z powodzeniem stosując (przez kilka lat) do automatycznego wykrywania i odczytywania plików unicode z FSO (zakładając, że są one mało endian i zawierać 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 
0

Piszę gadżet systemu Windows 7 i uruchamiam ten sam problem, a jeśli jest to możliwe, możesz po prostu zamienić pliki na inne kodowanie, na przykład: kodowanie ANSI "Windows-1251". Dzięki temu kodowaniu działa dobrze.

Jeśli używasz tego do pisania strony, lepiej będzie użyć innej metody programistycznej unikającej tego obiektu.

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 
'. 
'. 
Powiązane problemy