Добрый день коллеги. Недавно искал здесь на форуме, создание xml и перекодировку его в UTF-8. Нашел, сделал. Но оказалось, все не так просто. UTF-8 оказалась с BOM и не ложится в систему из за лишних байтов. Нашел в интернете код, с UTF-8 без BOM. Но он почему то не хочет работать. Вернее одна строка. Как код до нее доходит, то ексель зависает и вылетает с ошибкой. Прошу вашей помощи, кому интересно посмотрите код. Я там все расписал. Если возникнут вопросы задавайте.
StoTisteg это все идет автоматически. пользователь заполняет таблицу в екселе, далее жмет кнопку - программа сама формирует файл xml перекодирует его в utf -8 далее ложит на шину, шина его передает в электронный архив. Это все происходит без участия пользователей. Все автоматически. В общем то я это все реализовал. Но файл оказался с тремя лишними байтами UTF-8 с BOM. и этот файл не ложится в архив. Нужно избавиться от первых трех байтов. Нашел второй код. Он подходит полностью, но одна строка зависает. Я не пойму почему В примере в коде я эту строку выделил и подписал. Может у кого то есть похожий код рабочий. Буду очень благодарен, если кто выложит или подскажет в чем у меня ошибка.
' Функция для перекодировки файла в UTF-8 без BOM (то же самое, что и UTF-8, только без первых 3 байтов)
Function ChangeFileCharset_UTF8noBOM(ByVal filename$, Optional ByVal SourceCharset$) As Boolean
' функция перекодировки (смены кодировки) текстового файла
' В качестве параметров функция получает путь filename$ к текстовому файлу,
' Функция возвращает TRUE, если перекодировка прошла успешно
On Error Resume Next: Err.Clear
DestCharset$ = "utf-8"
With CreateObject("ADODB.Stream")
.Type = 2
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.LoadFromFile filename$ ' загружаем данные из файла
FileContent$ = .ReadText ' считываем текст файла в переменную FileContent$
.Close
.Charset = DestCharset$ ' назначаем новую кодировку "utf-8"
.Open
.WriteText FileContent$
'Write your data into the stream.
Dim binaryStream As Object
Set binaryStream = CreateObject("ADODB.Stream")
binaryStream.Type = 1
binaryStream.Mode = 3
binaryStream.Open
'Skip BOM bytes
.Position = 3
.CopyTo binaryStream
.Flush
.Close
binaryStream.SaveToFile filename$, 2
binaryStream.Close
End With
ChangeFileCharset_UTF8noBOM = Err = 0
End Function
' Функция перекодировки текста в UTF-8 без BOM
Function EncodeUTF8noBOM(ByVal txt As String) As String
For i = 1 To Len(txt)
l = Mid(txt, i, 1)
Select Case AscW(l)
Case Is > 4095: t = Chr(AscW(l) \ 64 \ 64 + 224) & Chr(AscW(l) \ 64) & Chr(8 * 16 + AscW(l) Mod 64)
Case Is > 127: t = Chr(AscW(l) \ 64 + 192) & Chr(8 * 16 + AscW(l) Mod 64)
Case Else: t = l
End Select
EncodeUTF8noBOM = EncodeUTF8noBOM & t
Next
End Function
Игорь по коду. Идет ошибка : Wrong number of arguments or invalid property assignment если по другому ссылаюсь то ошибка Argument not optional Верхний код возвращает пустой документ. Нижний сразу ошибку выдает. Буду думать дальше. что же не так.
StoTisteg по какому коду вопрос? Если тот что в файле. то там я выделил и справа написал что в этой строке вылетает с ошибкой. по коду Игоря выше написал. Причем верхний код Игоря. Видит текст, берет его, но когда идет переконвертация, в итоге значение = пусто почему то .
По коду Игоря. Верхнему коду FileContent$ = .ReadText возвращает пусто, либо знаки вопроса вместо текста. Не могу понять почему и в конце пишет False. Перекодировка не прошла.