mail mail

Макрос перекодировки (изменения кодировки) текста и файлов

Функции ChangeFileCharset и ChangeTextCharset предназначены для изменения кодировки символов в текстовых файлах и строках.

Исходную и конечную (желаемую) кодировку можно задать в параметрах вызова функций.

Список доступных на вашем компьютере кодировок можно найти в реестре Windows в ветке
HKEY_CLASSES_ROOT\MIME\Database\Charset

Среди доступных кодировок есть 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

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Попробуйте закомментировать строку On Error Resume Next в моей функции.

Если при этом макрос остановится с ошибкой - вы сразу обнаружите её причину, посмотрев значение передаваемой функции переменной.

PS: У меня совершенно нет опыта работы с Access - так что, возможно, причина и в вашем коде.

Для тестирования я бы заменил строку ns = ChangeTextCharset(ss, "UTF-8", "Windows-1251")

следующим кодом:

debug.print "Before: ", ss
ns = ChangeTextCharset(ss, "UTF-8", "Windows-1251")
debug.print "After: ", ns

Потом в окне Immediate изучить результат - и всё станет понятно.

Спасибо! Работает хорошо.
Но умення вопрос...
В цикле Do ... Loop назначает новую кодировку на первою строку, а все остальные остаются в исходной кодировке. Пример:

Dim ss As String
Dim ns As String
Dim st As ADODB.Recordset
Set st = New ADODB.Recordset
With st
.Open "NoteWE", CurrentProject.Connection, adOpenStatic, adLockPessimistic
.MoveFirst
End With
Dim nt As ADODB.Recordset
Set nt = New ADODB.Recordset
With nt
.Open "Клев", CurrentProject.Connection, adOpenStatic, adLockPessimistic

End With
' вызываем функцию ChangeTextCharset с указанием кодировок
Do Until st.EOF
ss = st(0).Value
ns = ChangeTextCharset(ss, "UTF-8", "Windows-1251")
nt.AddNew
nt.Fields(1) = ns
nt.Update
st.MoveNext
Loop

В чем я ошибся?
Зарание спасибо

Круто!!!
Спасибо, вчера весь день искал... ничего не помогло...
Только эта статья помогла...

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
7 + 8 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.