FileSystemObject - чтение файлов Unicode - PullRequest
11 голосов
/ 11 сентября 2009

Классический ASP, контекст VBScript.

Множество статей, включая этот Microsoft , скажем, вы не можете использовать FileSystemObject для чтения файлов Unicode.

Я столкнулся с этой проблемой некоторое время назад, поэтому переключился на использование ADODB.Stream вместо примера ReadText здесь вместо использования FileSystemObject.OpenTextFile (который принимает окончательный вариант). параметр, указывающий, открывать ли файл как Unicode, но на самом деле не работает).

Тем не менее, ADODB.Stream приводит к огромной боли при попытке прочитать файл на файловом ресурсе UNC (проблема, связанная с разрешениями). Итак, исследуя это, я наткнулся на следующий подход, который работает а) с файлами Unicode и б) с общими файловыми ресурсами 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

Это использует FSO для чтения файла Unicode без каких-либо видимых проблем, поэтому я запутался во всех ссылках, включая MS, говоря, что вы не можете использовать FSO для чтения файлов Unicode.

Кто-нибудь еще использовал этот подход для чтения файлов Unicode? Есть ли какие-то скрытые ошибки, которые мне не хватает, или вы действительно можете читать файлы Unicode, используя FSO?

Ответы [ 5 ]

10 голосов
/ 23 сентября 2009

Я думаю, что MS официально не заявляет, что поддерживает Unicode, потому что:

  1. Он не обнаруживает файлы Unicode, используя метку порядка байтов в начале файла, и
  2. Он поддерживает только файлы Unicode в формате Little-Endian UTF-16 (и вам нужно удалить метку порядка байтов, если она есть).

Вот пример кода, который я успешно использовал (в течение нескольких лет) для автоматического обнаружения и чтения файлов Unicode с помощью FSO (при условии, что они имеют прямой порядок и содержат спецификацию):

'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
4 голосов
/ 08 ноября 2012
'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
 '.
 '.
4 голосов
/ 11 сентября 2009

Да, эта документация устарела. Компонент сценариев действительно претерпел ряд изменений в свои первые годы (некоторые из них были критическими, если вы использовали раннее связывание), однако, по крайней мере с WK2000 SP4 и XP SP2 он был очень стабильным.

Просто будьте осторожны, что вы подразумеваете под юникодом. Иногда слово юникод используется более широко и может охватывать любую кодировку юникода. FSO не читает, например, UTF8 кодировки Unicode. Для этого вам нужно обратиться к ADODB.Stream.

0 голосов
/ 28 декабря 2010

Я пишу гаджет для Windows 7 и работаю над той же проблемой, и если это возможно, вы можете просто переключить свои файлы в другую кодировку, например: кодировку ANSI "windows-1251". С этой кодировкой все работает нормально.

Если вы используете это для написания сайта, то лучше использовать другой подход к разработке, избегая использования этих объектов.

0 голосов
/ 11 сентября 2009

Я бы сказал, если это работает, используйте его; -)

Я заметил, что статья о MS, на которую вы ссылаетесь, содержится в руководстве по написанию сценариев для Windows 2000 (!) Может быть, это устарело.

...