- Код: Выделить всё
Private Const CP_UTF8 = 65001
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function GetACP Lib "kernel32" () As Long
Function EncodeUTF8(ByVal cnvUni As String)
If cnvUni = vbNullString Then Exit Function
EncodeUTF8 = StrConv(WToA(cnvUni, CP_UTF8, 0), vbUnicode)
End Function
'--------------------------------
' WToA
'
' UNICODE to ANSI conversion, via a given codepage
'--------------------------------
Public Function WToA(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
Dim stBuffer As String
Dim cwch As Long
Dim pwz As Long
Dim pwzBuffer As Long
Dim lpUsedDefaultChar As Long
If cpg = -1 Then cpg = GetACP()
pwz = StrPtr(st)
cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, 0&, 0&, ByVal 0&, ByVal 0&)
stBuffer = String$(cwch + 1, vbNullChar)
pwzBuffer = StrPtr(stBuffer)
cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer), ByVal 0&, ByVal 0&)
WToA = Left$(stBuffer, cwch - 1)
End Function
Private Sub Form_Load()
Open "C:/test.htm" For Binary As #1
Dim s As String
s = "Текст текст текст"
s = EncodeUTF8(s)
Put #1, , s
Close #1
End Sub
Но, похоже, я что-то делаю не так. Браузеры воспринимают получившийся файл как win-1251, что чревато. Если принудительно поставить кодировку UTF8, то всё пашет. Что же я делаю не так, и как сделать, чтобы всё работало?
P.S. Поставить META не советуйте.
Added: что-то мне функция не нравится.