Сохраните текстовый файл UTF-8 в кодировке VBA - PullRequest
43 голосов
/ 26 марта 2010

как я могу записать строки в кодировке UTF-8 в текстовый файл из vba, например

Dim fnum As Integer
fnum = FreeFile
Open "myfile.txt" For Output As fnum
Print #fnum, "special characters: äöüß" 'latin-1 or something by default
Close fnum

Есть ли какие-либо настройки на уровне приложения?

Ответы [ 5 ]

70 голосов
/ 26 марта 2010

Я нашел ответ в сети :

Dim fsT As Object
Set fsT = CreateObject("ADODB.Stream")
fsT.Type = 2 'Specify stream type - we want To save text/string data.
fsT.Charset = "utf-8" 'Specify charset For the source text data.
fsT.Open 'Open the stream And write binary data To the object
fsT.WriteText "special characters: äöüß"
fsT.SaveToFile sFileName, 2 'Save binary data To disk

Конечно, не так, как я ожидал ...

17 голосов
/ 11 апреля 2012

Вы можете использовать метод CreateTextFile или OpenTextFile, оба имеют атрибут "unicode", полезный для настроек кодирования.

object.CreateTextFile(filename[, overwrite[, unicode]])        
object.OpenTextFile(filename[, iomode[, create[, format]]])

Пример: перезапись:

CreateTextFile:
 fileName = "filename"
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set out = fso.CreateTextFile(fileName, True, True)
 out.WriteLine ("Hello world!")
 ...
 out.close

Пример: Добавить:

 OpenTextFile Set fso = CreateObject("Scripting.FileSystemObject")
 Set out = fso.OpenTextFile("filename", ForAppending, True, 1)
 out.Write "Hello world!"
 ...
 out.Close

Подробнее о Документах MSDN

7 голосов
/ 21 июля 2011

Это записывает метку порядка байтов в начале файла, которая не нужна в файле UTF-8, и некоторым приложениям (в моем случае, SAP) это не нравится. Решение здесь: Могу ли я экспортировать данные Excel с UTF-8 без спецификации?

6 голосов
/ 27 ноября 2013

Вот еще один способ сделать это - с помощью функции API WideCharToMultiByte:

Option Explicit

Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
  ByVal CodePage As Long, _
  ByVal dwFlags As Long, _
  ByVal lpWideCharStr As Long, _
  ByVal cchWideChar As Long, _
  ByVal lpMultiByteStr As Long, _
  ByVal cbMultiByte As Long, _
  ByVal lpDefaultChar As Long, _
  ByVal lpUsedDefaultChar As Long) As Long

Private Sub getUtf8(ByRef s As String, ByRef b() As Byte)
Const CP_UTF8 As Long = 65001
Dim len_s As Long
Dim ptr_s As Long
Dim size As Long
  Erase b
  len_s = Len(s)
  If len_s = 0 Then _
    Err.Raise 30030, , "Len(WideChars) = 0"
  ptr_s = StrPtr(s)
  size = WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, 0, 0, 0, 0)
  If size = 0 Then _
    Err.Raise 30030, , "WideCharToMultiByte() = 0"
  ReDim b(0 To size - 1)
  If WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, VarPtr(b(0)), size, 0, 0) = 0 Then _
    Err.Raise 30030, , "WideCharToMultiByte(" & Format$(size) & ") = 0"
End Sub

Public Sub writeUtf()
Dim file As Integer
Dim s As String
Dim b() As Byte
  s = "äöüßµ@€|~{}[]²³\ .." & _
    " OMEGA" & ChrW$(937) & ", SIGMA" & ChrW$(931) & _
    ", alpha" & ChrW$(945) & ", beta" & ChrW$(946) & ", pi" & ChrW$(960) & vbCrLf
  file = FreeFile
  Open "C:\Temp\TestUtf8.txt" For Binary Access Write Lock Read Write As #file
  getUtf8 s, b
  Put #file, , b
  Close #file
End Sub
2 голосов
/ 31 декабря 2015

Я посмотрел на ответ от Маны, имя которого намекает на квалификацию и опыт кодирования. VBA docs скажем CreateTextFile(filename, [overwrite [, unicode]]) создает файл "как файл Unicode или ASCII. Значение True, если файл создается как файл Unicode; False, если он создан как файл ASCII. Если опущено, файл ASCII предполагается ". Хорошо, что файл хранит символы Юникода, но в какой кодировке? Unicode unicode не может быть представлен в файле.

Страница документа VBA для OpenTextFile(filename[, iomode[, create[, format]]]) предлагает третий вариант формата:

  • TriStateDefault 2 "открывает файл, используя системную настройку по умолчанию."
  • TriStateTrue 1 "открывает файл как Unicode."
  • TriStateFalse 0 "открывает файл как ASCII."

Мана передает -1 для этого аргумента.

Судя по документации VB.NET (не VBA, но я думаю, что отражает реальность того, как базовая ОС Windows представляет строки Unicode и отражается в MS Office, я не знаю), система по умолчанию является кодировкой использование 1 байта / символа юникода с использованием кодовой страницы ANSI для локали. UnicodeEncoding - это UTF-16. Документы также описывают, что UTF-8 также является «кодировкой Unicode», что имеет смысл для меня. Но я пока не знаю, как указать UTF-8 для вывода VBA, и не уверен, что данные, которые я записываю на диск с помощью OpenTextFile (,,, 1), имеют кодировку UTF-16. Сообщение Тамалека полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...