Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Как я пофиксил неправильную кодировку названий папок с FCKEditor
Постоянная ссылка 27-08-2007 anydoby java

Возникла задача - прикрутить к одной проге редактор html. После того, как я попробовал Dojo и TinyMCE и, соответственно, разочаровался и в первом, и втором, решил взять FCKEditor.

Ничего так редактор. Да вот единственная беда - нету поддержки java out of the box. Пришлось хачить самостоятельно. Нашел connector, написанный для JSP/Servlets и взял его за основу. Так как использую Spring и Velocity, пришлось дописать обертку для Velocity и контроллер для спринга, самый простой. Все вроде работает. И даже браузер файлов. Да вот беда - если папку назвать русскими буквами - на сервер приходят одни кракозяблы. И никакими перекодировками не исправляются. Сначала долго мучился на стороне сервера - устанавливал разные фильтры, чтобы устанавливалась кодировка запроса в utf-8, и пытался преобразовывать параметры, используя другие кодировки. Ничего не помогало.

Причина проблемы в том, что запрос FCKEditor делает при помощи XMLHttpRequest или чего там еще есть в javascriptе. И используется GET для общения с коннектором. Браузер кодирует строку запроса в ему одному известной кодировке. И потом на сервере, используя utf-8 для раскодировки получаются бяки, вместо букв.

Починить проблему оказалось делом 5 минут (это после того, как я продолбался с раскодировками на стороне сервера): нужно было просто поменять в скрипте fckeditor/editor/filemanager/browser/default/js/fckxml.js несколько строк, чтобы использовался не GET, а POST. Отличие заключается в том, что в POST можно в заголовке запроса явно указать кодировку параметров, что я и сделал. К удивлению, все сработало с первого раза.

Вот, какой кусочек кода получился:


FCKXml.prototype.LoadUrl = function( urlToCall, asyncFunctionPointer)
{	
	urlToCall = decodeURIComponent(urlToCall);
	var oFCKXml = this ;

var bAsync = ( typeof(asyncFunctionPointer) == 'function' ) ;

var oXmlHttp = this.GetHttpRequest();

var parametersIndex = urlToCall.indexOf("?"); var parameters = urlToCall.substring(parametersIndex + 1); urlToCall = urlToCall.substring(0, parametersIndex); oXmlHttp.open( "POST", urlToCall, bAsync ) ; oXmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');

if ( bAsync ) { .............................. }

oXmlHttp.send( parameters );

Как видим, все очень просто. Сначала строка запроса (а сюда передается уже закодированная строка с параметрами) декодируется, чтобы получились исходные символы. Потом отрезается подстрока с параметрами и открывается только URL. Устанавливается кодировка запроса и передается строка с параметрами в теле запроса (в уже нужной нам кодировке). На сервере остается только вызывать request.setCharacterEncoding("utf-8"), если вы этого не сделали в отдельном фильтре, и прочитать русские буковки.

Добавить комментарий

Предыдущая статья NullPointerException при обращении к свойствам примитивных типов Следующая статья Редактируемая страница в браузере