четверг, 18 марта 2010 г.

Altova XMLSpy: учим русский

Пожалуй лучшим средством для работы с XML документами является Altova XMLSpy. Конечно не единственным, хотя бы из-за его небесплатности и неповоротливости на старых машинах. Но тут пойдёт речь о другом недостатке продукта - картавости.

Проблем с отображением русских слов у XMLSpy нет, но есть один маленький изъян. При отображении XSD схемы документа символ бесконечности (∞) превращается в непечатный символ. А собака зарыта в использовании шрифта Symbol: данный шрифт не является unicode-ним, поэтому нужно быть аккуратным при его использовании.
Если мы находимся в западноевропейской кодировке, тогда проблем с бесконечностью не возникает, т.к. все символы с кодом до 0xFF точняком попадают на такие же unicode-символы. А вот если сменить в региональных настройках кодировку, тогда начнётся преобразование. И тогда символ бесконечности с кодом 0xA5 в кириллице превратится в букву Ґ с кодом 0x0490. Ну а такого кода в шрифте Symbol нету.
Выходом может служить использование символа с кодом 0xB5, т.к. внешне он похож на символ бесконечности и в кириллице он не испортится. Но с одной стороны и бесконечность получится какая-то недоделанная, да и работать на других кодировках не будет. Поэтому лучше использовать unicode-символ бесконечности с кодом 0x221E.
Подходящим шрифтом может послужить Times New Roman - внешне символы бесконечности похожи. Осталось только внести все эти изменения в программу. Но без изменения кода тут не обойтись.
Менять программу можно с помощью любого шестнадцатеричного редактора, благо проверки контрольных сумм на область данных в XMLSpy нет. Я не буду тут указывать конкретных смещений в коде программы, т.к. от версии к версии они будут меняться. Подскажу лишь как найти нужное место.
Лучшей отправной точкой является поиск названия шрифта Symbol. Нужно лишь учесть, что название записано в unicode, поэтому просто приведу байты, которые нужно найти:
00 00 53 00 79 00 6D 00 62 00 6F 00 6C 00 00 00
Заменить их нужно на короткое название Times:
00 00 54 00 69 00 6D 00 65 00 73 00 00 00 00 00
Теперь нужно найти сам символ бесконечности. Лежит он рядом, точнее раньше. Нужно лишь найти последовательность, только искать в обратном направлении:
A5 00 00 00
И заменить её на unicode бесконечность:
1E 22 00 00
Вроде бы и всё. Но есть ещё одна «неправильная» бесконечность - в случае расширении типа. Лежит она дальше по коду (теперь ищём в прямом направлении):
A5 00 29 00 00 00
Ну и меняется на аналогичную:
1E 22 29 00 00 00
Теперь радуемся схемам, т.к. даже в ответственных структурах, где используют XMLSpy, символ бесконечности «неправильный». Мелочь, а приятно.

Комментариев нет:

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