2

Некоторая плохо написанная программа экспортировала файл Excel с неправильной кодировкой на иврите, с такими загадочными строками, как:

ãåç ì÷åçåú äåãòåú åéîé äåìãú

Используя сайт, решающий кодировку, я обнаружил, что исходный текст был:

דוח לקוחות הודעות וימי הולדת 

Что, кстати, означает «Клиентские отчеты-уведомления и дни рождения», на иврите.

Есть ли способ изменить кодировку для всего документа из Excel?

2 ответа2

2
  1. Сохраните файл в формате CSV с разделителями-запятыми.
  2. Откройте его в OpenOffice, это позволит вам изменить кодировку на правильную.
  3. Находясь в OpenOffice, сохраните файл в формате .xls.
1

Это не полное решение, но оно выглядит как шаг к решению.

Обе строки имеют длину 28 символов, что предполагает кодирование «один к одному».

Отображение двух строк в шестнадцатеричном виде дает:

(E3)(E5)(E7)(20)(EC)(F7)(E5)(E7)(E5)(FA)(20)(E4)(E5)(E3)(F2)(E5)(FA)(20)(E5)(E9)(EE)(E9)(20)(E4)(E5)(EC)(E3)(FA)
(5D3)(5D5)(5D7)(20)(5DC)(5E7)(5D5)(5D7)(5D5)(5EA)(20)(5D4)(5D5)(5D3)(5E2)(5D5)(5EA)(20)(5D5)(5D9)(5DE)(5D9)(20)(5D4)(5D5)(5DC)(5D3)(5EA)

Вторая строка в основном соответствует значениям Unicode для букв иврита, как и ожидалось.

Преобразование для получения первой строки выглядит так:

  20 (space) unchanged
  5Dx        Ex
  5Ex        Fx

Это не полная диаграмма преобразования, потому что значения Юникода для букв иврита простираются от шестнадцатеричного 591 до 5F4.

Следующая грубая подпрограмма принимает первую строку и возвращает вторую.

Function Decode(CompactStg As String) As String

  Dim CompactChar As Integer
  Dim DecodedChar As Integer
  Dim DecodedStg As String
  Dim Pos As Integer

  DecodedStg = ""

  For Pos = 1 To Len(CompactStg)
    CompactChar = Asc(Mid(CompactStg, Pos, 1))
    Select Case CompactChar
      Case 32 To 127     ' Hex 20 - 7F
        ' No change
      DecodedChar = CompactChar
      Case 224 To 239    ' Hex E0 - EF
        ' Convert EX to 5DX
        DecodedChar = CompactChar + 1264
      Case 240 To 255    ' Hex F0 - FF
        ' Convert FX to 5EX
        DecodedChar = CompactChar + 1264
    End Select
    DecodedStg = DecodedStg & ChrW(DecodedChar)
  Next

  Decode = DecodedStg

End Function

Я использовал следующую процедуру для вывода строк в непосредственное окно. С помощью нескольких примеров вы сможете определить все конверсии. Буквы иврита шестнадцатеричные с 591 по 5C7 также могут быть преобразованы путем добавления десятичной дроби 1264, но это не может быть преобразованием для букв иврита с 5F0 по 5F4.

Sub HexOut(Stg)

  Dim Pos

  For Pos = 1 To Len(Stg)
    Debug.Print "(" & Hex(AscW(Mid(Stg, Pos, 1))) & ")";
  Next
  Debug.Print

End Sub

Повеселись!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .