Функции ChangeFileCharset и ChangeTextCharset предназначены для изменения кодировки символов в текстовых файлах и строках.
Исходную и конечную (желаемую) кодировку можно задать в параметрах вызова функций.
ВНИМАНИЕ: Функции чтения и сохранения текста в файл в заданной кодировке
Список доступных на вашем компьютере кодировок можно найти в реестре Windows в ветке
HKEY_CLASSES_ROOTMIMEDatabaseCharset
Среди доступных кодировок есть koi8-r, ascii, utf-7, utf-8, Windows-1250, Windows-1251, Windows-1252, и т.д. и т.п.
Определить исходную и конечную кодировку можно, воспользовавшись онлайн-декодером:
http://www.artlebedev.ru/tools/decoder/advanced/
(после преобразования снизу будет написано, из какой кодировки в какую переведён текст)
Sub ПримерИспользования_ChangeTextCharset() ИсходнаяСтрока = "бНОПНЯ" ' вызываем функцию ChangeTextCharset с указанием кодировок ' (меняем кодировку с KOI8-R на Windows-1251) ПерекодированнаяСтрока = ChangeTextCharset(ИсходнаяСтрока, "Windows-1251", "KOI8-R") MsgBox "Результат перекодировки: """ & ПерекодированнаяСтрока & """", _ vbInformation, "Исходная строка: """ & ИсходнаяСтрока & """" End Sub
Function ChangeFileCharset(ByVal filename$, ByVal DestCharset$, _ Optional ByVal SourceCharset$) As Boolean ' функция перекодировки (смены кодировки) текстового файла ' В качестве параметров функция получает путь filename$ к текстовому файлу, ' и название кодировки DestCharset$ (в которую будет переведён файл) ' Функция возвращает TRUE, если перекодировка прошла успешно On Error Resume Next: Err.Clear With CreateObject("ADODB.Stream") .Type = 2 If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку .Open .LoadFromFile filename$ ' загружаем данные из файла FileContent$ = .ReadText ' считываем текст файла в переменную FileContent$ .Close .Charset = DestCharset$ ' назначаем новую кодировку .Open .WriteText FileContent$ .SaveToFile filename$, 2 ' сохраняем файл уже в новой кодировке .Close End With ChangeFileCharset = Err = 0 End Function
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _ Optional ByVal SourceCharset$) As String ' функция перекодировки (смены кодировки) текстовоq строки ' В качестве параметров функция получает текстовую строку txt$, ' и название кодировки DestCharset$ (в которую будет переведён текст) ' Функция возвращает текст в новой кодировке On Error Resume Next: Err.Clear With CreateObject("ADODB.Stream") .Type = 2: .Mode = 3 If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку .Open .WriteText txt$ .Position = 0 .Charset = DestCharset$ ' назначаем новую кодировку ChangeTextCharset = .ReadText .Close End With End Function
‘ Функция для перекодировки файла в 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
- 142885 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Смена кодировки строки с UTF-8 на ANSI (Windows-1251) и преобразование кодировки текста ANSI (Windows-1251) в UTF-8.
Перекодировка строки с UTF-8 в ANSI (Windows-1251) может понадобиться в VBA, например, при загрузке данных из CSV-файла с кодировкой UTF-8 на рабочий лист книги Excel.
Изменение кодировки текста UTF-8 на ANSI (Windows-1251) для 32-разрядных платформ:
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 |
Пример перекодировки строки с UTF-8 в ANSI (Windows-1251):
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-разрядных платформ:
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 |
Пример перекодировки строки с ANSI (Windows-1251) в UTF-8:
Изменение кодировки в 64-разрядных системах
Если у вас 64-разрядная версия VBA Excel, добавьте ключевое слово PtrSafe после оператора Declare и замените тип данных Long на LongPtr:
Private Declare PtrSafe Function MultiByteToWideChar Lib «kernel32.dll» (ByVal CodePage As LongPtr, ByVal dwFlags As LongPtr, ByVal lpMultiByteStr As String, ByVal cchMultiByte As LongPtr, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr) As LongPtr Private Declare PtrSafe Function WideCharToMultiByte Lib «kernel32.dll» (ByVal CodePage As LongPtr, ByVal dwFlags As LongPtr, ByVal lpWideCharStr As LongPtr, ByVal cchWideChar As LongPtr, ByVal lpMultiByteStr As LongPtr, ByVal cchMultiByte As LongPtr, ByVal lpDefaultChar As LongPtr, ByVal lpUsedDefaultChar As LongPtr) As LongPtr |
В среде разработки VBA 7 тип данных LongPtr на 32-разрядных платформах интерпретируется как Long, а в 64-разрядных — как LongLong.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Attribute VB_Name = "cUTF8" Option Explicit 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 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 Public 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 Public 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 |
Функции ChangeFileCharset и ChangeTextCharset предназначены для изменения кодировки символов в текстовых файлах и строках.
Исходную и конечную (желаемую) кодировку можно задать в параметрах вызова функций.
ВНИМАНИЕ: Новая (универсальная) версия функции сохранения текста в файл в заданной кодировке:
http://excelvba.ru/code/SaveTextToFile
Список доступных на вашем компьютере кодировок можно найти в реестре Windows в ветке
HKEY_CLASSES_ROOTMIMEDatabaseCharset
Среди доступных кодировок есть koi8-r, ascii, utf-7, utf-8, Windows-1250, Windows-1251, Windows-1252, и т.д. и т.п.
Определить исходную и конечную кодировку можно, воспользовавшись онлайн-декодером:
http://www.artlebedev.ru/tools/decoder/advanced/
(после преобразования снизу будет написано, из какой кодировки в какую переведён текст)
Sub ПримерИспользования_ChangeTextCharset()
ИсходнаяСтрока = "бНОПНЯ"
' вызываем функцию ChangeTextCharset с указанием кодировок
' (меняем кодировку с KOI8-R на Windows-1251)
ПерекодированнаяСтрока = ChangeTextCharset(ИсходнаяСтрока, "Windows-1251", "KOI8-R")
MsgBox "Результат перекодировки: """ & ПерекодированнаяСтрока & """", _
vbInformation, "Исходная строка: """ & ИсходнаяСтрока & """"
End Sub
Function ChangeFileCharset(ByVal filename$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As Boolean
' функция перекодировки (смены кодировки) текстового файла
' В качестве параметров функция получает путь filename$ к текстовому файлу,
' и название кодировки DestCharset$ (в которую будет переведён файл)
' Функция возвращает TRUE, если перекодировка прошла успешно
On Error Resume Next: Err.Clear
With CreateObject("ADODB.Stream")
.Type = 2
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.LoadFromFile filename$ ' загружаем данные из файла
FileContent$ = .ReadText ' считываем текст файла в переменную FileContent$
.Close
.Charset = DestCharset$ ' назначаем новую кодировку
.Open
.WriteText FileContent$
.SaveToFile filename$, 2 ' сохраняем файл уже в новой кодировке
.Close
End With
ChangeFileCharset = Err = 0
End Function
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As String
' функция перекодировки (смены кодировки) текстовоq строки
' В качестве параметров функция получает текстовую строку txt$,
' и название кодировки DestCharset$ (в которую будет переведён текст)
' Функция возвращает текст в новой кодировке
On Error Resume Next: Err.Clear
With CreateObject("ADODB.Stream")
.Type = 2: .Mode = 3
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.WriteText txt$
.Position = 0
.Charset = DestCharset$ ' назначаем новую кодировку
ChangeTextCharset = .ReadText
.Close
End With
End Function
‘ Функция для перекодировки файла в 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
- 87909 просмотров
Sub CallKML(control As IRibbonControl) Dim i As Integer Dim fn As Long Dim npg As Integer If ActiveSheet.Name = "Вуличні ПГ" Then wnet = "Вуличні ПГ" If ActiveSheet.Name = "Об'єктові ПГ" Then wnet = "Об'єктові ПГ" fn = FreeFile Open ThisWorkbook.Path & "ResultExcel.kml" For Output As fn Print #fn, "<?xml version='1.0' encoding='UTF-8'?>" Print #fn, "<kml xmlns='http://www.opengis.net/kml/2.2'>" Print #fn, "<Document>" Print #fn, "<Style id=""placemark-blue"">" Print #fn, "<IconStyle>" Print #fn, "<Icon>" Print #fn, "<href>images/1.png</href>" Print #fn, "</Icon>" Print #fn, "<hotSpot x='0.5' y='0.5' xunits='fraction' yunits='fraction'/>" Print #fn, "</IconStyle>" Print #fn, "<LabelStyle><color>ff000000</color><scale>0.5</scale><face>Arial</face><visible>1</visible><style>00000000</style></LabelStyle>" Print #fn, "</Style>" Print #fn, "<Style id=""placemark-red"">" Print #fn, "<IconStyle>" Print #fn, "<Icon>" Print #fn, "<href>images/2.png</href>" Print #fn, "</Icon>" Print #fn, "<hotSpot x='0.5' y='0.5' xunits='fraction' yunits='fraction'/>" Print #fn, "</IconStyle>" Print #fn, "<LabelStyle><color>ff000000</color><scale>0.5</scale><face>Arial</face><visible>1</visible><style>00000000</style></LabelStyle>" Print #fn, "</Style>" Print #fn, "<Style id=""placemark-orange"">" Print #fn, "<IconStyle>" Print #fn, "<Icon>" Print #fn, "<href>images/3.png</href>" Print #fn, "</Icon>" Print #fn, "<hotSpot x='0.5' y='0.5' xunits='fraction' yunits='fraction'/>" Print #fn, "</IconStyle>" Print #fn, "<LabelStyle><color>ff000000</color><scale>0.5</scale><face>Arial</face><visible>1</visible><style>00000000</style></LabelStyle>" Print #fn, "</Style>" npg = 0 For i = 2 To 1001 If ActiveSheet.Cells(i, 2) <> "" Then npg = npg + 1 Print #fn, "<Placemark>" If wnet = "Вуличні ПГ" Then Print #fn, "<description>" & "Вуличні ПГ" & "</description>" If wnet = "Об'єктові ПГ" Then Print #fn, "<description>" & "Об'єктові ПГ" & "</description>" Print #fn, "<name>" & ActiveSheet.Cells(i, 2) & "</name>" If ActiveSheet.Cells(i, 3) = "Справний" Then Print #fn, "<styleUrl>#placemark-blue</styleUrl>" If ActiveSheet.Cells(i, 3) = "Несправний" Then Print #fn, "<styleUrl>#placemark-red</styleUrl>" Print #fn, "<ExtendedData> " Print #fn, "<Data name='Вулиця'> <value>" & ActiveSheet.Cells(i, 1) & "</value> </Data>" Print #fn, "<Data name='Технічний стан'> <value>" & ActiveSheet.Cells(i, 3) & "</value> </Data>" Print #fn, "<Data name='Характер несправності'> <value>" & ActiveSheet.Cells(i, 4) & "</value> </Data>" Print #fn, "<Data name='Належність'> <value>" & ActiveSheet.Cells(i, 5) & "</value> </Data>" Print #fn, "<Data name='Примітка'> <value>" & ActiveSheet.Cells(i, 8) & "</value> </Data>" If ActiveSheet.Cells(i, 9) <> "" Then Print #fn, "<Data name='gx_media_links'> <value>" & ActiveSheet.Cells(i, 9) & "</value> </Data>" Print #fn, "</ExtendedData> " Print #fn, "<Point> <coordinates>" & ActiveSheet.Cells(i, 7); "," & ActiveSheet.Cells(i, 6) & ",0.0</coordinates> </Point>" Print #fn, "</Placemark>" End If Next i Print #fn, "</Document>" Print #fn, "</kml>" Close fn ChangeFileCharset Filename$, "utf-8" MsgBox "Експорт таблиці в kml завершено" End Sub Function ChangeFileCharset(ByVal Filename$, ByVal DestCharset$, _ Optional ByVal SourceCharset$) As Boolean On Error Resume Next: Err.Clear With CreateObject("ADODB.Stream") .Type = 2 If Len(SourceCharset$) Then .Charset = "Windows-1251" .Open .LoadFromFile "ResultExcel.kml" FileContent$ = .ReadText .Close .Charset = "utf-8" .Open .WriteText FileContent$ .SaveToFile "ResultExcel.kml", 2 .Close End With ChangeFileCharset = Err = 0 End Function
-
April 25 2013, 11:33
Получил файл в формате MXL — выгрузка из 1С, с абракадаброй внутри. Попробовал два решения: на VBA и на Python. Сравните и убедитесь.
Для начала на Python:
>>> print 'Чековая лента SMS'.decode('utf-8') Чековая лента SMS
Теперь на VBA. Нашел такое решение (см. первоисточник):
Sub ПримерИспользования_ChangeTextCharset()
ИсходнаяСтрока = «Р§РµРєРѕРІР°СЏ лента SMS«
‘ вызываем функцию ChangeTextCharset с указанием кодировок
‘ (меняем кодировку с Windows-1251 на UTF-8)
ПерекодированнаяСтрока = ChangeTextCharset(ИсходнаяСтрока, «UTF-8», «Windows-1251«)
MsgBox «Результат перекодировки: ««» & ПерекодированнаяСтрока & «»«», _
vbInformation, «Исходная строка: ««» & ИсходнаяСтрока & «»«»
End Sub
Function ChangeFileCharset(ByVal filename$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As Boolean
‘ функция перекодировки (смены кодировки) текстового файла
‘ В качестве параметров функция получает путь filename$ к текстовому файлу,
‘ и название кодировки DestCharset$ (в которую будет переведён файл)
‘ Функция возвращает TRUE, если перекодировка прошла успешно
On Error Resume Next: Err.Clear
With CreateObject(«ADODB.Stream»)
.Type = 2
If Len(SourceCharset$) Then .Charset = SourceCharset$ ‘ указываем исходную кодировку
.Open
.LoadFromFile filename$ ‘ загружаем данные из файла
FileContent$ = .ReadText ‘ считываем текст файла в переменную FileContent$
.Close
.Charset = DestCharset$ ‘ назначаем новую кодировку
.Open
.WriteText FileContent$
.SaveToFile filename$, 2 ‘ сохраняем файл уже в новой кодировке
.Close
End With
ChangeFileCharset = Err = 0
End Function
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As String
‘ функция перекодировки (смены кодировки) текстовоq строки
‘ В качестве параметров функция получает текстовую строку txt$,
‘ и название кодировки DestCharset$ (в которую будет переведён текст)
‘ Функция возвращает текст в новой кодировке
On Error Resume Next: Err.Clear
With CreateObject(«ADODB.Stream»)
.Type = 2: .Mode = 3
If Len(SourceCharset$) Then .Charset = SourceCharset$ ‘ указываем исходную кодировку
.Open
.WriteText txt$
.Position = 0
.Charset = DestCharset$ ‘ назначаем новую кодировку
ChangeTextCharset = .ReadText
.Close
End With
End Function
Получился такой результат:
Выводы? )))
Макросы в Excel VBA Макросы Смена кодировки
Смена кодировки
Excel всё норовит сохранять текстовые файлы в Winodws-1251. Очень актуален вопрос преобразования текста в другие кодировки, в первую очередь в UTF-8.
Вот несколько полезных функций для решения подобных вопросов:
Перекодировка файла из кодировки SourceCharset$ в UTF-8
'filename - путь к файлу
'SourceCharset - исходная кодировка (необязательный параметр)
'BomDelete - удалять ли BOM?
Function ChangeFileCharset_UTF8noBOM(ByVal filename$, _
Optional ByVal SourceCharset$, _
Optional BomDelete As Boolean = True) As Boolean
On Error Resume Next: Err.Clear
Dim DestCharset As String 'Кодировка
DestCharset = "utf-8"
Dim FileContent As Variant
With CreateObject("ADODB.Stream")
.Type = 2
'Исходная кодировка, если указана
If Len(SourceCharset$) Then .Charset = SourceCharset$
.Open
.LoadFromFile filename$ 'Загружаем данные из файла
'Считываем текст в переменную FileContent
FileContent = .ReadText
.Close 'Закрываепм файл
'Назначаем файлу новую кодировку "utf-8"
.Charset = DestCharset
.Open 'Снова открываепм файл
'Записываем текст в файл в новой кодировке
.WriteText FileContent
'Удалить BOM?
If BomDelete Then
Dim binaryStream As Object
Set binaryStream = CreateObject("ADODB.Stream")
binaryStream.Type = 1
binaryStream.Mode = 3
binaryStream.Open
'Удаляем BOM байты
.Position = 3
.CopyTo binaryStream
.Flush
.Close
binaryStream.SaveToFile filename$, 2
binaryStream.Close
End If
End With
ChangeFileCharset_UTF8noBOM = Err = 0
End Function
Сохраняет текст в указанной кодировке в файл
'Функция сохраняет текст txt
'в кодировке Charset$ в файл filename$
'koi8-r, ascii, utf-7, utf-8, utf-8noBOM,
'utf-16, windows-1251, unicode и другие
Function SaveTextToFile(ByVal txt$, ByVal filename$, _
Optional ByVal encoding$ = "utf-8noBOM") As Boolean
Dim FSO As Object
Dim ts As Object
Dim binaryStream As Object
On Error Resume Next: Err.Clear
Select Case encoding$
Case "windows-1251", "", "ansi"
Set FSO = CreateObject("scripting.filesystemobject")
Set ts = FSO.CreateTextFile(filename, True)
ts.Write txt: ts.Close
Set ts = Nothing: Set FSO = Nothing
Case "utf-16", "utf-16LE"
Set FSO = CreateObject("scripting.filesystemobject")
Set ts = FSO.CreateTextFile(filename, True, True)
ts.Write txt: ts.Close
Set ts = Nothing: Set FSO = Nothing
Case "utf-8noBOM"
With CreateObject("ADODB.Stream")
.Type = 2: .Charset = "utf-8": .Open
.WriteText txt$
Set binaryStream = CreateObject("ADODB.Stream")
binaryStream.Type = 1: binaryStream.Mode = 3
binaryStream.Open:
.Position = 3: .CopyTo binaryStream 'Skip BOM bytes
.Flush: .Close
binaryStream.SaveToFile filename$, 2
binaryStream.Close
End With
Case Else
With CreateObject("ADODB.Stream")
.Type = 2: .Charset = encoding$: .Open
.WriteText txt$
'Сохраняем файл в заданной кодировке
.SaveToFile filename$, 2
.Close
End With
End Select
SaveTextToFile = Err = 0: DoEvents
End Function
Перекодировка строки
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As String
If Trim(txt$) = "" Then
ChangeTextCharset = ""
Else
On Error Resume Next: Err.Clear
With CreateObject("ADODB.Stream")
.Type = 2
.Mode = 3
'Исходная кодировка
If Len(SourceCharset$) Then .Charset = SourceCharset$
.Open
.WriteText txt$
.Position = 0
.Charset = DestCharset$ 'Назначаем новую кодировку
ChangeTextCharset = .ReadText
.Close
End With
End If
End Function
Перекодировка файла
'False если не получилось
Function ChangeFileCharset(filename As String, _
DestCharset As String, _
Optional SourceCharset As String) As Boolean
Dim FileContent As String 'Содержимое файла
On Error Resume Next: Err.Clear
With CreateObject("ADODB.Stream")
.Type = 2
'Если начальная кодировка задана явно то отмечаем её
If Len(SourceCharset) Then .Charset = SourceCharset
.Open 'Открываем объект ADO
.LoadFromFile filename 'Загружаем в объект файл
FileContent = .ReadText 'Извлекаем контент
.Close 'Закрываем объект
.Charset = DestCharset 'Переустанавливаем кодировку
.Open 'Снова открываем
.WriteText FileContent 'Записываем в него контент
.SaveToFile filename 'Сохраняем по тому же путив файл
.Close 'Окончательно закрываем
End With
ChangeFileCharset = Err = 0 'Успешно?
End Function
- Remove From My Forums
-
Question
-
I have a question that is probably pretty simple, but I can’t seem to get it figure out.
I have a bunch of text in windows-1251 encoding and I was hoping to convert it to utf-8, so it works across different machines easier (i hope).
I tried something simple like this:
Dim txt As String = «¥»
Dim ar() As Byte
ar = System.Text.Encoding.Default.GetBytes(txt)
txt = System.Text.Encoding.UTF8.GetString(ar)
But I’m not getting the result I need, actually I’m only getting the boxes instead of any letters. Now, I know that «ar» does contain a good set of bytes that represent letters in windows-1251, but how do I take that array of bytes and convert it into a utf-8 string?
Thanks,
Viktor.
Answers
-
That character you specified is not in Windows-1251. See the chart here: http://www.microsoft.com/globaldev/reference/sbcs/1251.mspx
The reason that it «almost» works is because Encoding.Default is using your current code page, which must be something other than Windows-1251. Had you really been converting using Windows-1251, that character would change to a ? mark because it is not in Windows-1251. If you really want Windows-1251, you would need to use System.Text.Encoding.GetEncoding(«Windows-1251») instead of Encoding.Default.
> I have a bunch of text in windows-1251 encoding
Do you have this data in bytes? If you have it in a String, it has already been converted to Unicode — String is always Unicode. If this conversion did not happen correctly, the characters in your String might not be correct.
Once you have it in bytes, it is easy to convert it to a Unicode string:
Replace:
txt = System.Text.Encoding.UTF8.GetString(ar) With:
txt = System.Text.Encoding.Default.GetString(ar) or
txt = System.Text.Encoding.GetEncoding(«Windows-1251»).GetString(ar) Notice that you need to use the Encoding that corresponds to the format the bytes in the parameter (here, ar) use.
If you subsequently need to turn txt into UTF-8 bytes, you can use:
Dim utf8Bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(txt) (There is really no such thing as a UTF-8 String — only UTF-8 Byte array. Make sure you understand this as it goes along way for dealing with text data in .NET.)
-
Marked as answer by
Wednesday, July 2, 2008 4:25 PM
-
Marked as answer by