Интернационализация в ColdFusion MX

Большинство разработчиков на CFML при переходе с ColdFusion 5.0 на ColdFusion MX (CFMX) сталкиваются с проблемами в работе с русским языком. Помочь в этом случае может понимание основных принципов интернационализации, положенных в основу новой версии ColdFusion сервера. В данной статье вы найдете описание этих принципов и рекомендации по преодолению возможных проблем.

 

Интернационализация с самого начала

Прежде чем погрузиться в тонкости интернационализации CFMX есть смысл разобраться в самом предмете – интернационализация. Специалисты в этой области различают два понятия: Чтобы написать приложение с учетом принципов интернационализации, разработчик должен принять во внимание массу аспектов, которые станут впоследствии предметом задачи локализации: Первые два пункта из этого списка обычно объединяют в понятие «кодировка» или «charset». Строго говоря, это не совсем корректно, но для предмета нашего обсуждения разница не столь существенна. Именно вопрос кодировок является основным камнем преткновения при работе с CFMX. Попробуем разобраться в корнях этой проблемы – природе CFMX.

 

CFMX и Java

CFMX или ColdFusion 6.0 в основной своей массе написан на Java и в недрах своих работает под управлением J2EE сервера приложений Macromedia JRun 4.x. Думаю для многих разработчиков на CFML это уже не секрет. Переход с ColdFusion 5.0 на ColdFusion MX был для команды Allaire/Macromedia поистине мужским поступком. Честь им за это и хвала. Но нам, разработчикам, теперь придется разбираться с норовистым характером нового сервера. Начнем с ключевых особенностей его работы:

Это, среди всего прочего, означает, что при работе с однобайтовыми строками CFMX должен выполнять преобразование в UNICODE и обратно, используя какие-то предположения относительно кодировки однобайтных строк. Последний пункт особенно интересен, так как проявляется не только во время исполнения (runtime), но и во время компиляции (compile time). Но об этом чуть позже...

Сейчас же отметим тот факт, что предположения относительно однобайтной кодировке символом CFMX делает на основании информации двух источников:


Рис. 1. Диалог установки настроек локализации Windows 2000


Рис. 2. Окно настроек параметров запуска виртуальной машины Java сервера CFMX

Вы можете сами поэкспериментировать с этими настройками. Но для того, чтобы эксперименты были осмысленными, важно знать, а что же действительно думает CFMX в отношении однобайтной кодировки. Здесь в качестве лакмусовой бумажки можно порекомендовать CFML код, отображающий системные свойства «user.region», «user.language», «file.encoding» текущего потока исполнения Java:
Результаты работы этого кода при различных настройках локализации операционной системы Windows 2000 можно увидеть на рисунке 3 и 4.


Рисунок 3. Представления CFMX об однобайтной кодировке при русских настройках лок-ции Windows 2000


Рисунок 4. Представления CFMX об однобайтной кодировке при американских настройках лок-ции Windows 2000

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

 

Проблемные места CFMX

Уж коль скоро все внутри CFMX в UNICODE, проблемы с однобайтными строками могут появляться на границах с внешним миром. Схематически это положение вещей представлено на рисунке 5.

Схема взаимодействия внутренней среды CFMX с внешним миром
Рисунок 5. Схема взаимодействия внутренней среды CFMX с внешним миром

Как видно из рисунка, основными «проблемными» местами являются:
  1. HTTP Response
  2. HTTP Request
  3. CFML скрипты
  4. Работа с файлами
  5. Работа с базами данных (DBMS)
  6. Поисковый механизм Verity
  7. CFX – теги на С++

Разберемся с каждым из них по отдельности.

1. HTTP Response

Тут не столько проблема сколько специфика. По умолчанию CFMX отдает все страницы в кодировке UTF-8. Если вас это не устраивает, то можно использовать тег CFCONTENT.

Например:
Однако хочу все же посоветовать смириться с увеличением объема исходящего трафика и принять религию UTF-8. По большому счету это правильно.

2. HTTP Request

Здесь дело в том, что CFMX, получая данные запроса, должен, исходя из своего естества, привести их к UNICODE. И тут работает следующая механика: Например:
Обратите внимание кодировки устанавливаются раздельно для GET и POST запросов. По аналогии с предыдущим пунктом хочу посоветовать использовать UTF-8. Здесь важно правильно сочетать cfcontent и setEncoding(), поскольку Web-броузер, как правило, кодирует символы запроса в соответствии с кодировкой полученной ранее HTML-страницы.

Внимание! У базового дистрибутива CFMX существует проблема при работе с POST запросами в режиме «multipart/form-data». В этом случае сервер не обращает внимание на setEncoding(). Вылечить это можно установкой ColdFusion MX Updater Release 1 (September 16, 2002) или выше.

Резюмируя вышесказанное можно утверждать, что, если вы имеете дело с инсталляцией CFMX c установленным Updater, то с русским языком на уровне HTTP запрос/ответ у вас все будет в порядке без каких-либо дополнительных указаний. При этом и Request и Response будут кодироваться в UTF-8.

3. CFML скрипты

CFML скрипты зачастую также содержат текстовые строки. И здесь также важно, чтобы CFMX верно определился с кодировкой этих строк. В данном случае ситуация немного осложняется тем, что принятие этого решения происходит во время компиляции, а не во время исполнения, и здесь, как правило, не срабатывает явное указание кодировки в настройках запуска виртуальной машины Java в административном режиме ColdFusion сервера. И только правильные установки локализации операционной системы работают безотказно.

Macromedia предлагает использовать для написания скриптов UNICODE, который в полной мере поддерживается в редакторе Dreamweaver MX. В этом случае все и всегда будет в порядке. Дело в том, что файлы в UNICODE обычно начинаются с нескольких специальных байт, именуемых как BOM (byte order mark). На этот признак как раз и реагирует CFMX при чтении CFML скриптов.

Если же вы привыкли к однобайтному CFML-коду, то выхода два: Инструкция cfprocessingdirective интересна тем, обрабатывается во время компиляции, а не во время исполнения, поэтому ее следует включить в каждый (!) CFML-скрипт. Например:
Кроме того, в этой инструкции нельзя использовать переменные в качестве значения параметра «pageencoding», так как их значения доступны лишь во время исполнения (runtime), а до этого дело еще не дошло.

Внимание! Компиляция скриптов осуществляется сервером при первом к ним запросе. При повторном запросе работает уже скомпилированный Java-класс, поэтому смена локали сервера ничего не изменит для уже скомпилированных скриптов. Будьте с этим внимательны! Если скрипты вашего приложения нуждаются в перекомпиляции, просто удалите содержимое каталога C:\CFusionMX\wwwroot\WEB-INF\cfclasses с поправкой на место инсталляции вашего CFMX.

4. Работа с файлами

Нюансы интернационализации при работе с файлами в CFMX сказываются в основном при выполнении операций чтения/записи. Здесь работают практически те же принципы, что и при работе с CFML скриптами, то есть играют роль представления среды исполнения Java о кодировке однобайтных строк. Разница лишь в том, что работа с файлами производится во время исполнения (runtime).

В дополнение к этому механизму у тега CFFILE появился новый атрибут CHARSET, который позволяет явно указать однобайтную кодировку в конкретном случае использования CFFILE.

Например:
Разумеется, исключение составляет опция READBINARY, при которой файл читается как набор байт без преобразования в UNICODE.

В качестве рекомендуемой техники здесь можно посоветовать положится на настройки локализации сервера или, если речь идет о хостинге приложения у провайдера, завести глобальную переменную с кодировкой однобайтных файловых и использовать ее в качестве значения атрибута CHARSET тега CFFILE при совершении файловых операций. Разумеется можно также использовать UNICODE.

5. Работа с базами данных

Учитывая глубокое родство CFMX с Java, не приходиться удивляться тому, что для соединения с базами данных используется механизм JDBC. В поставку CFMX включены лицензированные у компании DataDirect механизмы взаимодействия с базами данных DataDirect SequeLink. И конечно речь опять идет о UNICODE.

К сожалению, простых и всеобъемлющих рекомендаций на все случаи взаимодействия CFMX с базами данных, дать очень сложно, если вообще возможно. Загадок тут еще очень много. Поэтому приведем описание лишь нескольких достаточно хорошо изученных случаев:

При возникновении других проблем можно порекомендовать пойти экспериментальным путем, вооружившись знаниями о UNICOD’овой природе CFMX. Большим подспорьем в таких делах являются также форумы технической поддержки Macromedia: webforums.macromedia.com/coldfusion.

6. Поисковый механизм Verity и CFX – теги на С++

CFMX, как и предыдущие его инкарнации, поддерживает CFX API, который позволяет расширять функциональность сервера путем написания тегов на С++ или Java. Но если теги на С++ были «родными» для предыдущих версий ColdFusion, а Java – немного инородным телом, то в новой версии все поменялось с точностью до наоборот.

Теперь русскоязычные строки могут оказаться искаженными при передаче через параметры в CFX-тег, написанный на С++.

На этот случай компания Macromedia предлагает использовать, так называемую, двухбайтную CFXNeo.dll, выполняющую функции связующего звена между средой Java и внешним «родным» для операционной системы кодом. В частности она работает при вызовах CFX-тегов на С++. На практике это действительно помогает. Скачать двухбайтную CFXNeo.dll можно со страницы по адресу: www.macromedia.com/v1/Handlers/index.cfm?ID=23220.

Поисковые механизмы Verity, встроенные в CFMX, по всей видимости, конструктивно реализованы как CFX-расширение, поэтому подчиняются тем же самым правилам. Одним словом ставьте двухбайтную CFXNeo.dll – не пожалеете.

 

Резюме

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

 

Ссылки по теме


Дата статьи: 08.01.2003 г.
Автор статьи: Сергей Кузнецов (kuznetsov@reksoft.ru)
Источник: www.cfug.ru/publication.cfm?p=pub4

 


Hosted by uCoz