[VBA]Excel输出utf-8编码格式文件 使用WideCharToMultiByte
时间:2011-04-24 来源:撬棍
  'API 函数WideCharToMultiByte参数说明
  '第一个参数:指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。
  '    CP_ACP 当前系统ANSI代码页
  '    CP_MACCP 当前系统Macintosh代码页
  '    CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
  '    CP_SYMBOL Symbol代码页.
  '    CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么
  '    CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
  '    CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
  '第二个参数:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,我都是把它设为0。
  '第三个参数: 待转换的宽字符串?
  '第四个参数:待转换宽字符串的长度,-1表示转换到字符串结尾。
  '第五个参数: 接收转换后输出新串的缓冲区?
  '第六个参数: 输出缓冲区大小?
  '第七个参数: 指向字符的指针?
  '第八个参数:开关变量的指针,用以表明是否使用过默认字符,一般设为0。
  Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
          ByVal CodePage As Long, _
          ByVal dwFlags As Long, _
          ByVal lpWideCharStr As Long, _
          ByVal cchWideChar As Long, _
          ByRef lpMultiByteStr As Any, _
          ByVal cchMultiByte As Long, _
          ByVal lpDefaultChar As String, _
          ByVal lpUsedDefaultChar As Long) As Long
  Private Const CP_UTF8 = 65001
  Private Sub WriteOut(strPath As String, str As String)
          Dim lBufSize As Long
          Dim lRest As Long
          Dim bUTF8() As Byte
          Dim TLen As Long
     
      TLen = Len(str)
      lBufSize = TLen * 3 + 1
      ReDim bUTF8(lBufSize - 1)
      lRest = WideCharToMultiByte(CP_UTF8, 0, StrPtr(str), TLen, bUTF8(0), lBufSize, vbNullString, 0)
      If lRest Then
          lRest = lRest - 1
          ReDim Preserve bUTF8(lRest)
          Open strPath For Binary As #1
          Put #1, , bUTF8
          Close #1
      End If
  End Sub
'如何使用==================================================
Private Sub CommandButton1_Click()
      Const PATH = "E:\testfile.xml"
      Dim fso
      Set fso = CreateObject("Scripting.FileSystemObject")
      '这里建立一个空文件 并不打开他 建完拉到
      fso.CreateTextFile (PATH)
      '把所有的内容都放到这个字符串里
      Dim str As String
      For i = 1 To 50
          Dim test As String
          test = Trim(Worksheets("Sheet1").Range("A" + Trim(i)).Text)
          If Not test = vbNullString Then
              str = str & test & vbCrLf
          End If
      Next
      '不用打开文件 让WriteOut直接去写
      Call WriteOut(PATH, str)
      MsgBox "O K"
End Sub










