Смена кодировки строки с UTF-8 на ANSI (Windows-1251) и преобразование кодировки текста ANSI (Windows-1251) в UTF-8.
Перекодировка строки с UTF-8 в ANSI (Windows-1251) может понадобиться в VBA, например, при загрузке данных из CSV-файла с кодировкой UTF-8 на рабочий лист книги Excel.
Смена кодировки UTF-8 на Windows-1251
Изменение кодировки текста UTF-8 на ANSI (Windows-1251) для 32-разрядных платформ:
1 2 3 4 5 6 7 8 |
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long Function FromUTF8(ByVal sText As String) As String Dim nRet As Long, strRet As String strRet = String(Len(sText), vbNullChar) nRet = MultiByteToWideChar(65001, &H0, sText, Len(sText), StrPtr(strRet), Len(strRet)) FromUTF8 = Left(strRet, nRet) End Function |
Если у вас 64-разрядная версия VBA Excel, добавьте ключевое слово PtrSafe после оператора Declare.
Пример перекодировки строки с UTF-8 в ANSI (Windows-1251):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Primer() Dim num1 As Integer, a1 As String, str1 As String 'Выбираем файл CSV с кодировкой UTF-8 a1 = Application.GetOpenFilename("Текст с разделителями,*.csv", , "Выбор файла") If Right(a1, 4) <> ".csv" Then Exit Sub 'Открываем файл и считываем текст в переменную num1 = FreeFile Open a1 For Input As num1 str1 = Input(LOF(num1), num1) Close num1 'Меняем кодировку с UTF-8 на Windows-1251 str1 = FromUTF8(str1) 'Работаем с текстом и вставляем нужные значения на рабочий лист End Sub |
Преобразование кодировки ANSI в UTF-8
Изменение кодировки текста ANSI (Windows-1251) на UTF-8 для 32-разрядных платформ:
1 2 3 4 5 6 7 8 |
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 cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long Function ToUTF8(ByVal sText As String) As String Dim nRet As Long, strRet As String strRet = String(Len(sText) * 2, vbNullChar) nRet = WideCharToMultiByte(65001, &H0, StrPtr(sText), Len(sText), StrPtr(strRet), Len(sText) * 2, 0&, 0&) ToUTF8 = Left(StrConv(strRet, vbUnicode), nRet) End Function |
Если у вас 64-разрядная версия VBA Excel, добавьте ключевое слово PtrSafe после оператора Declare.
Пример перекодировки строки с ANSI (Windows-1251) в UTF-8:
1 |
str1 = ToUTF8(str1) |
Примечания
Ключевое слово PtrSafe добавляется к оператору Declare, чтобы адаптировать функцию, написанную для 32-разрядной платформы к 64-разрядной.
Кроме того, можно тип данных Long заменить на LongPtr, который в 32-разрядных системах интерпретируется как Long, а в 64-разрядных — как LongLong.