Файл UTF-8 добавляется в vbscript / classicasp - это можно сделать? - PullRequest
2 голосов
/ 18 декабря 2008

Мои текущие знания:

Если вы пытаетесь писать текстовые файлы в vbscript / asp land, у вас есть два варианта.

  1. Scripting.FileSystemObject
  2. объект ADODB.Stream

Scripting.FileSystemObject не поддерживает utf8. Он будет писать в Ascii или Unicode (и тратить два байта на большинство ваших персонажей)

ADODB.Stream не поддерживает добавление (afaik). Я не могу понять, как заставить объект ADODB.Stream действительно открыть файл и записать его, когда я вызываю stream.Write. Есть функция SaveToFile, но она выводит весь поток.

Если вам нужно записать файлы объемом 1 ГБ, вам потребуется заполнить весь 1 ГБ в потоке, прежде чем вы сможете его записать.

Есть ли специальный прием для получения объекта ADODB.Stream для ссылки на файл на диске? Я старался stream.Open "URL = file: /// c: \ test.txt" но это дало ошибку.

1 Ответ

7 голосов
/ 19 декабря 2008

В этом сценарии я бы, вероятно, создал бы COM-компонент, который принимает строку и запускает ее через WideCharToMultiByte , чтобы преобразовать ее в UTF-8.

Если вы действительно хотите остаться в VBScript, я просто взломал очень быстрое и очень грязное преобразование UTF-8 ...

Function Utf8(ByVal c)

    Dim b1, b2, b3

    If c < 128 Then
        Utf8 = chr(c)
    ElseIf c < 2048 Then
        b1 = c Mod 64
        b2 = (c - b1) / 64
        Utf8 = chr(&hc0 + b2) & chr(&h80 + b1)
    ElseIf c < 65536 Then
        b1 = c Mod 64
        b2 = ((c - b1) / 64) Mod 64
        b3 = (c - b1 - (64 * b2)) / 4096
        Utf8 = chr(&he0 + b3) & chr(&h80 + b2) & chr(&h80 + b1)
    End If

End Function

Просто откройте файл с помощью Scripting.FileSystemObject, используя системную кодировку по умолчанию. Затем передайте каждый символ строки, которую вы хотите написать, через эту функцию.

ПРИМЕЧАНИЕ , что функция ожидает кодовую точку Unicode, поэтому обязательно используйте AscW() вместо простого Asc():

For i = 1 to Len(s)
    file.Write Utf8(AscW(Mid(s, i, 1)))
Next
...