Интернационализация с самого начала
Прежде чем погрузиться в тонкости интернационализации 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
Рисунок 3. Представления CFMX об однобайтной кодировке при русских настройках лок-ции Windows 2000
Рисунок 4. Представления CFMX об однобайтной кодировке при американских настройках лок-ции Windows 2000
Проблемные места CFMX
Уж коль скоро все внутри CFMX в UNICODE, проблемы с однобайтными строками могут появляться на границах с внешним миром. Схематически это положение вещей представлено на рисунке 5.
Рисунок 5. Схема взаимодействия внутренней среды CFMX с внешним миром
Разберемся с каждым из них по отдельности.
1. HTTP Response
Тут не столько проблема сколько специфика. По умолчанию CFMX отдает все страницы в кодировке UTF-8. Если вас это не устраивает, то можно использовать тег CFCONTENT.
Например: Однако хочу все же посоветовать смириться с увеличением объема исходящего трафика и принять религию UTF-8. По большому счету это правильно.2. HTTP Request
Здесь дело в том, что CFMX, получая данные запроса, должен, исходя из своего естества, привести их к UNICODE. И тут работает следующая механика:Внимание! У базового дистрибутива 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-коду, то выхода два:Внимание! Компиляция скриптов осуществляется сервером при первом к ним запросе. При повторном запросе работает уже скомпилированный 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 с базами данных, дать очень сложно, если вообще возможно. Загадок тут еще очень много. Поэтому приведем описание лишь нескольких достаточно хорошо изученных случаев:
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:
Ссылки по теме
© 2002-2005 г. Вадим Пушкарев