2009-09-11 18 views
8

従来のASP、VBScriptコンテキスト。FileSystemObject - Unicodeファイルの読み取り

this Microsoft oneを含む多くの記事は、できません。は、Unicodeファイルを読み取るためにFileSystemObjectを使用します。

私はUnicodeとしてファイルを開くかどうかを示す最後のパラメータを受け入れ、実際にdoesnのんた(代わりFileSystemObject.OpenTextFileを使用する、READTEXT例hereあたり、代わりADODB.Streamを使用するように切り替え、しばらく前にこの問題に遭遇仕事はしません)。

ただし、ADODB.Streamは、UNCファイル共有(アクセス許可関連の問題)でファイルを読み取ろうとすると、苦痛を与えます。だから、これを調査し、私はユニコードのファイルで)動作しますa。次のアプローチに出くわし、およびb)のUNCファイル共有にわたる:

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 

これは明白な問題のないUnicodeのファイルを読むためにFSOを使用しているので、I MSを含むすべてのリファレンスに関して、あなたがユニコードファイルを読むためにFSOを使うことはできないと言って混乱しています。

誰かがユニコードファイルの読み取りにこの方法を使用しましたか?私が行方不明になっている隠された悪夢はありますか、実際にはFSOを使ってUnicodeファイルを実際に読むことができますか?

答えて

3

はい、ドキュメントは古くなっています。しかし、少なくともWK2000 SP4とXP SP2は非常に安定していたので、スクリプティングコンポーネントは初期の段階で一連の変更を行っていました(初期バインディングを使用していた場合、一部は変更を破っていました)。

ユニコードが意味することにちょっと注意してください。ユニコードという言葉は、より広範に使用され、ユニコードのあらゆるコード化をカバーすることもあります。 FSOは、たとえばUnicodeのUTF8エンコードを読み取っていません。そのためには、ADODB.Streamにフォールバックする必要があります。

私はMSが正式ので、それはUnicodeをサポートしていることを述べるいないと思います
+0

ありがとうございます。この例では、 "unicode"として読み込まれているファイルはすべて、FSO.OpenTextFile( "unicode"の場合はTriStateTrueを使用)を使用してファイルを開いて書き込みを行う同様のコードで作成されるため、FSOを読み込み、すべて。 ADODB.Streamは、別のマシン上のファイル共有から読み込みしようとすると、あらゆる種類のhoo-haaを引き起こします。なぜなら、私はそれを離れているからです。 – AdaTheDev

0

それが動作するかどうか、私は;-)

それを使う、と言うだろう私はあなたが参照するMSの資料では、Windows 2000(!)スクリプティングガイドからである気づきます。多分それは時代遅れです。

6

:それは少しだけをサポートし、ファイルの先頭にバイト順マークを使用してUnicodeのファイルを検出し、

  • しない

    1. -Endian UTF-16 Unicodeファイル(存在する場合は、バイトオーダーマークを削除する必要があります)。ここで

    (彼らはリトルエンディアンで、BOMが含まれていると仮定して)私はFSOのUnicodeのファイルを自動検出して読み取るために(数年間)が正常に使用されているいくつかのサンプルコードです:

    '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

    私はWindows 7ガジェットを作成していて、同じ問題を抱えています。可能であれば、ファイルをANSIエンコーディング "windows-1251"などの別のエンコーディングに切り替えることができます。このエンコーディングでうまくいきます。

    これをサイトの作成に使用している場合は、このオブジェクトを避ける別の開発アプローチを使用することをお勧めします。

    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 
    '. 
    '. 
    
    関連する問題