среда, 27 апреля 2011 г.

Монгольский шрифт Arial Mon и борьба с кодировкой

Монгольские коллеги и товарищи могут присылать вам документы в шрифте Arial Mon с нестандартной кодировкой. Даже если вы установите этот шрифт, вы не сможете редактировать текст, проверка орфографии работать не будет. Как бороться с такими документами?

Шрифт замышлялся монголами как средство локализации компьютеров с OS Windows с предустановленной кодовой страницей CP-1252 (западно-европейские
страны).

Было это судя по всему в эпоху WIndows 95.

С появлением Windows и в Office поддержки Unicode шрифт Arial Mon был неверно модифицирован, произошла некорректная замена кодов символов:
Unicode соответствия CP-1252 вместо
Unicode соответствия CP-1251

В итоге монголы создают документы на монгольском и русском языках в неверной кодировке. Если у адресата нет шрифта Arial Mon (в котором нет необходимости, т.к. стандартный шрифт Arial поддерживает знаки кириллицы), то получит вордовский документ вида:

Æ.ÖÝÂÝÝÍ – ÎÑÍÎÂÀÒÅËÜ
ÌÎÍÃÎËÜÑÊÎÉ ÆÓÐÍÀËÈÑÒÈÊÈ
Äîêëàä Ãåíäèðåêòîðà íàöèîíàëüíîãî èíôîðìàãåíòñòâà “ÌÎÍÖÀÌÝ”, äîêòîðà, ïðîôåññîðà Ò.Áààñàíñóðýíà íà íàó÷íî-ïðàêòè÷åñêîé êîíôåðåíöèè, ïðîõîäèâøåé â Óëààíáààòàðå 7 ÿíâàðÿ 2011 ãîäà è ïîñâÿùåííîé 130-ëåòíåìó þáèëåþ âåëèêîãî ïðîñâåòèòåëÿ è ó÷åíîãî

Значит надо просто перекодировать неверные символы согласно таблицам:






НО ! вместо "ï" и "є" подставить монгольские "ү" и "ө"; украинские буквы не используются, поэтому их можно не обрабатывать. В конце заменяем Arial Mon на стандартный Arial

Создаем скрипт на VBA.
В цикле обрабатывается диапазон C0-FF, поскольку в нем различие неверной кодировки идет ровно со смещением 0x350. Отдельно заменяем символы "№", "ё", "ү" и "ө".


Sub MongolFont_Unicoding()

Dim i As Long

Set myRange = ActiveDocument.Content
myRange.Find.MatchCase = True

' Main range

For i = &HC0 To &HFF
     myRange.Find.Execute FindText:=ChrW(i), ReplaceWith:=ChrW(i + &H350), _
            Replace:=wdReplaceAll
Next i

' Some characters
myRange.Find.Execute FindText:=ChrW(&HA8), ReplaceWith:=ChrW(&H401), _
  Replace:=wdReplaceAll 'capital Yo

myRange.Find.Execute FindText:=ChrW(&HAA), ReplaceWith:=ChrW(&H4E8), _
  Replace:=wdReplaceAll 'Barred capital O

myRange.Find.Execute FindText:=ChrW(&HAF), ReplaceWith:=ChrW(&H4AE), _
   Replace:=wdReplaceAll 'capital mongol Y

myRange.Find.Execute FindText:=ChrW(&HB8), ReplaceWith:=ChrW(&H451), _
  Replace:=wdReplaceAll 'small Yo

myRange.Find.Execute FindText:=ChrW(&HB9), ReplaceWith:=ChrW(&H2116), _
  Replace:=wdReplaceAll 'No sign

myRange.Find.Execute FindText:=ChrW(&HBA), ReplaceWith:=ChrW(&H4E9), _
  Replace:=wdReplaceAll 'Barred small O

myRange.Find.Execute FindText:=ChrW(&HBF), ReplaceWith:=ChrW(&H4AF), _
  Replace:=wdReplaceAll 'small mongol Y


With ActiveDocument.Content.Find
  .ClearFormatting
  .Font.Name = "Arial Mon"
  With .Replacement
    .ClearFormatting
    .Font.Name = "Arial"
  End With
  .Execute FindText:="", ReplaceWith:="", Format:=True, _
  Replace:=wdReplaceAll
End With

End Sub

Запускаем скрипт и получаем документ, корректный с точки зрения Unicode, верно редактируемый, отрабатываемый спеллчекерами, и который можно пересылать по всему миру, радуясь что его везде смогут прочесть без установки шрифта Arial Mon.


Итог скрипта:

Ж.ЦЭВЭЭН – ОСНОВАТЕЛЬ

МОНГОЛЬСКОЙ ЖУРНАЛИСТИКИ

Доклад Гендиректора национального информагентства “МОНЦАМЭ”, доктора, профессора Т.Баасансурэна на  


и т.д.


Первоначально результат я получил за 2 минуты пересохраняя из Блокнота, но при этом потерялось форматирование (а в научных документах много ссылок и форматирования). Поэтому я потратил 1 час на скрипт, и еще полчаса на статью. Надеюсь, пригодится

4 комментария:

  1. где ты этому всему учился? если не секрет )))
    Давно смотрю за твоими публикациями и деятельностью, но ни разу не промелькнули источники познаний. мне, как отсталому в этих вопросах гражданину, интересно

    ОтветитьУдалить
  2. гугл, плюс лет 20 назад прослушанные лекции, и практитум по ассемблеру.

    ОтветитьУдалить
  3. Огромное спасибо за написание макроса. Работаем с монголами по конференции. Прислали статьи в такой кодировке, скрипт очень помог их исправить

    ОтветитьУдалить
    Ответы
    1. Очень рад! Странно, что монголы до сих пор не справились с нестандартными кодировками.

      Удалить