Тема: VBS: Глюк ADODB.Stream?
Случайно столкнулся с неприятным глюком при использовании ADODB.Stream:
для конвертации из кодировки UTF-8 в Windows-1251 использую функцию из копилки идей
При чтении из файла в кодировке UTF-8, содержащего символы определяющие денежные единицы, например символ Йены (код в таблице Unicode U+00A5) или анг.фунта (U+00A3), при условии что не установлена опция On Error Resume Next получаем ошибку
Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры
Точнее ошибка возникает не при чтении, а при дальнейшем использовании строки считанной из файла.
Я написал тестовый пример (см. ниже), который создает строки в формате UTF-8, содержащие символы C2A0 ... C2BF (символы Unicode U+00A0...U+00BF) и потом их конвертирует в Win-1251 - в результате получается, что создаются не пустыми лишь некоторые файлы.
U+00A0 U+00A4 U+00A6 U+00A7 U+00A9 U+00AB U+00AC U+00AD U+00AE U+00B0 U+00B1 U+00B5 U+00B6 U+00B7 U+00BB.
Остальные создаются пустыми.
Парадокс: Если конвертировать UTF-8 в кодовую таблицу 866, то таких проблем не возникает. Некоторые символы просто не перекодируются и всё - т.е. файлы в 866-кодировке в тестовом примере получаются размером 2 либо 3 байта.
Кто-нибудь из гуру может прокомментировать такое странное поведение ADODB.Stream?
PS: при использовании аналогичной функции из копилки с перекодировкой файла таких проблем не возникает ![]()
Option Explicit
Dim i
On Error Resume Next
for i=&HA0 to &HBF
test i
next 'i
On Error GoTo 0
WScript.Quit
sub test(sAsc)
Dim sBuf, oFileOut
Dim oFSO : Set oFSO = CreateObject("Scripting.FileSystemObject")
sBuf=chr(&HC2) & chr(sAsc) '
set oFileOut = oFSO.CreateTextFile(hex(sAsc) & ".txt",True)
'oFileOut.WriteLine StrConv(sBuf,"cp866","UTF-8")
oFileOut.WriteLine StrConv(sBuf,"windows-1251","UTF-8")
oFileOut.Close
end sub
Function StrConv(Text,SourceCharset,DestCharset)
Dim Stream
Set Stream = CreateObject("ADODB.Stream")
Stream.Type = 2
Stream.Mode = 3
Stream.Open
Stream.Charset = SourceCharset
Stream.WriteText Text
Stream.Position = 0
Stream.Charset = DestCharset
StrConv = Stream.ReadText
End Function
