Просмотр полной версии : (не)русские буквы в javascript-окнах
Антон Мельников
26.05.2003, 20:42
Захотелось сделать проверку заполнения обязательных полей в почтовой форме (той, которая обычный элемент контента).
Проверка-то происходит, да вот сообщение о незаполненных полях выдается кракозябрами (типа Iacaaiea oo?a eee no?aia: Aaoa)(не знаю, отобразятся ли они здесь; вообще это всякие буквы латинницы с умляутами и прочими диакритическими(?) знаками).
На текущий момент накопал вот чего:
Обработка объекта FORM происходит в "tslib/class.tslib_content.php" .
Там есть строки типа rawurlencode($conf["goodMess"]).
Функция rawurlencode "возвращает строку, в которой все не-алфавитные символы, кроме: "-" "_" и "." будут заменены знаком процента (%), с двумя символами за ним. Это кодировка, описанная в RFC 1738 для защиты не-буквенных символов от интерпретирования.".
В результате образуется строка вида "%D2%C4%E0%F2%E0%20%EE" (программа перекодировщик "Штирлиц" называет такую кодировку "Q.P. Percent". msIE такого не понимает, по крайней мере, в javascript-окошках. Точнее, он не понимает, что это символы в кодировке win.
Кстати, rawurlencode встречается в большой части кода typo3. Видимо, здесь же причина кракозябров в русифицированом бэкенде.
Мысль такая: заменить rawurlencode своей функцией, которая будет перекодировать в "Q.P. Percent" только те символы, которые реально нужно прекодировать, а русские буквы оставлять без изменений.
Либо перекодировать все, но не с помощью rawurlencode, не в "Q.P. Percent", а в другим способом. Гораздо лучше, например, работают варианты "Q.P. html numeric" ( йцу ) или "Q.P. java" ( u0439u0446u0443u043Au0435u043D ), они описывают символ в юникодовой таблице, так что браузер не сможет перепутать кодировку.
Ух, устал писать.. Завтра еще посмотрю..
Гордиенко Алексей
24.10.2005, 12:52
Так как же всетаки быть?
Может действительно заменить rawurlencode своей функцией, что-то типа:
function TYPO3_rawurlencode($string) {
$hex=\"\";
$retstr = \"\";
for ($i=0; $i < strlen($string) ;$i++) {
$char = $string[$i];
if(ord($char) < 193 || ord($char) > 241)
$retstr .= rawurlencode($char);
else
$retstr .= $char;
}
return $retstr;
}
Valery Romanchev
24.10.2005, 12:58
Господа! читайте новости на главной странице этого сайта.
Проблема решена - скачиваейте экстеншен.
Если вдруг нужно чтобы код формы был валидный XTHML transitional - тогда этот экст нужно пропатчить.
Гордиенко Алексей
24.10.2005, 14:00
Я его поставил. Да вот отношения к моей проблеме он как мне кажется не имеет.
Я решил установить модуль Front End User Admin
Как описывается в документации.
Так вот при регистрации нового пользователя при повторной загрузке формы регистрации в полях Личная информация например Логин, Адрес данные отображаются кракозябрами.
Я так понял что параметр в форму передается через JavaScript, а именно updateForm('fe_users_form','FE[fe_users][address]',unescape('Ленина%2050'))
при этом строка 'Ленина%2050' формируется с использованием php функции rawurlencode.
Или я что-то не понимаю?
Гордиенко Алексей
24.10.2005, 14:06
Что-бы было поняно:
Строка в примере формируется функцией TYPO3_rawurlencode($string), а следовательно отображается правильно 'Ленина%2050' (только пробел заменен на %20)
Я тоже инсталировал Extension "onet_correctform" вроде как бы помогло но не совсем :(
Если я прописываю сообщение прямо в файл "t3lib/jsfunc.validateform.js" тогда изображение правильное но если я обрабатываю сообщение через Setup, например как указано ниже или через Constant Editor тогdа сообщение о незаполненных полях выдается также кракозябрами!
А это важно для многоязычного сайта :neutral:
Может ктонибуть уже с этим сталкивался? Может еще надо чтото вписать в Setup?
Установленый Charset = windows-1251
Контактформа здесь: http://pdkprint.ru/index.php?id=31
tt_content.mailform.20 {
REQ=1
emailMess= Проверте вами заданный E-Mail адрес!
badMess= Заполините пожалуйсто все поля!
}
Ещё возникает другая проблема после инсталяции exctension "onet_correctform" не работает проверка E-mail.
например
Email : | *email=input,40 | | EMAIL
Typo3 просто игнорирует это поле не проверяя заполнено ли оно или правильно в ведён E-Mail адрес
Всем привет.
Тема остается открытой, как я понимаю.
Я установил этот onet_correctform - ничего не изменилось. Надпись об ошибке как была иероглифами, так и осталась.
МОжет его как-то настроить надо?
В новом репозитории этого ext нет... Описания никакого найти не могу.
Может кто сталкивался с подобной проблемой?
Я зделал пару следующих изменений в файле typo3conf/ext/onet_correctform/class.ux_tslib_cObj.php и теперь все как бы работает, но я не знаю, не повлияют ли эти изменение негативно?!
Образец на: Полиграфические услуги Полиграфический Дом [Коммерсантk (http://www.pdkprint.ru/index.php?id=31)
Однако еще есть маленькая проблема:Проблема состоит в том, что если я меняю выдающее сообщение через Template-Constant-Editor или через Setup, эти изменения не влияют. Только если я редактирую эти сообщения прямо в файле t3lib/jsfunc.validateform.js, изменения действуют.
switch((string)$modeParameters[0]){
case 'EREG':
$fieldlist[] = '_EREG';
$fieldlist[] = rawurlencode($modeParameters[1]);
$fieldlist[] = rawurlencode($modeParameters[2]);
$fieldlist[] = rawurlencode($confData['fieldname']);
//$fieldlist[] = rawurlencode($confData['label']); //Original
$fieldlist[] = $confData['label']; // Мои изменения
$confData['required'] = 1; // Setting this so "required" layout is used.
break;
case 'EMAIL':
$fieldlist[] = '_EMAIL';
$fieldlist[] = rawurlencode($confData['fieldname']);
//$fieldlist[] = rawurlencode($confData['label']); //Original
$fieldlist[] = $confData['label']; // Мои изменения
$confData['required'] = 1; // Setting this so "required" layout is used.
break;
default:
if ($confData['required'] && $confData['type']!='check') {
//$fieldlist[] = rawurlencode($confData['fieldname']); //Original
//$fieldlist[] = rawurlencode($confData['label']); //Original
$fieldlist[] = $confData['fieldname']; // Мои изменения
$fieldlist[] = $confData['label']; // Мои изменения
// SV+
$fieldlist_clean[] = $confData['fieldname'];
$fieldlist_clean[] = $confData['label'];
// SV-
}
break;
}
и здесь тоже...
if ($conf['REQ']){
// SV+
// original
// $validateForm=' onsubmit="return validateForm(\\''.$formname.'\\',\\''.implode(',', $fieldlist_clean).'\\',\\''.rawurlencode($conf['goodMess']).'\\',\\''.rawurlencode($conf['badMess']).'\\',\\''.rawurlencode($conf['emailMess']).'\\')"';
// изменил
$validateForm=' onsubmit="return validateForm(\\''.$formname.'\\',\\''.implode(',', $fieldlist).'\\',\\''.rawurlencode($conf['goodMess']).'\\',\\''.rawurlencode($conf['badMess']).'\\',\\''.rawurlencode($conf['emailMess']).'\\')"';
// SV-
$GLOBALS['TSFE']->additionalHeaderData['JSFormValidate'] = '<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.validateform.js"></script>';
} else $validateForm='';
/**
* Apache 2.0.49
* PHP 4.3.4
* Mysql 4.0.18
* Typo3 4.0
*/
Копал сам, вот что нашел.
Проблема имеет место при кодировке UTF-8.
В файле typo3/sysext/cms/tslib/class.tslib_content.php, формируется текст обработчика события onsubmit() формы так (строка 2027):
$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fi eldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
Интересующие нас строки (метки полей) лежат в массиве $fieldlist, закодированные функцей rawurlencode(), которая кодирует utf8 строки побайтово и в итоге мы получаем вместо строки "Ваш e-mail:" строку "%D0%92%D0%B0%D1%88%20e-mail%3A", т.е. каждая русская буква становится двумя символами "В" -> "%D0%92".
Едем дальше. JavaScript функция validateForm(theFormname,theFieldlist,goodMess,bad Mess,emailMess) в файле t3lib/jsfunc.validateform.js принимает эту строку в качестве параметра theFieldlist, и декодирует ее функцией unescape().
unescape(string) возвращает декодированную версию URL-КОДИРОВАННОЙ строки, прошедший как параметр функции. Кодирование URL преобразовывает неалфавитно-цифровые символы в шестнадцатеричные значения (типа %20 для пробела). Функции escape и unescape неправильно работают с не- ASCII символами.
Функции escape и unescape не используют Unicode, как указано в спецификации ECMA. Вместо этого они используют указания Internet Engineering Task Force (IETF) для заменяющих/escaping символов. В URI символы используют US-ASCII-символы (набор символов ISO-Latin-1). URI это последовательность символов из базового латинского алфавита, цифры и несколько специальных символов (например, / и @). Еscape-последовательности не поддерживают как Unicode-значения \uXXXX или %uXXXX, как специфицировано ECMA, но поддерживают %XX, где XX это 16-ричное число из двух цифр (например, %7E). В URI представлены восьмеричными числами, как 8-битные байты. Чтобы escape и unescape могли работать с поддерживаемыми Web-сервером URL и URI, JavaScript не использует Unicode для этих функций.
* escape возвращает 16-ричную кодировку специфицированной строки из набора символов ISO-Latin-1.
* unescape возвращает ASCII-строку, последовательность символов из набора ISO-Latin-1.
Unicode-специфичные escape-последовательности %uXXXX не поддерживаются.
А теперь внимание вопрос :)
Какая функция javascript раскодирует urlencoded строку и примет во внимание utf-8? Или может я не в том направлении копать начал?
Впринципе я пока обхожусь такми решением:
В файле typo3/sysext/cms/tslib/class.tslib_content.php, формируется текст обработчика события onsubmit() формы так (строка 2027):
//$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fi eldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.rawurldecode(im plode(',',$fieldlist)).'\','.t3lib_div::quoteJSval ue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
Таким образом передавая незакодированную строку в функцию javascript validateForm().
Примечание, нельзя использовать символ `"` и `,` в метке поля. (ну и не надо)
В javascript есть функция decodeURI() - она умеет декодить utf-8 строку, закодированную rawurlencoded()
Так что можно не трогать typo3/sysext/cms/tslib/class.tslib_content.php, а поправить файл t3lib/jsfunc.validateform.js
function validateForm(theFormname,theFieldlist,goodMess,bad Mess,emailMess) {
var formObject = document[theFormname];
theFieldlist = decodeURI(theFieldlist); // добавленная строка
if (!formObj............
Valery Romanchev
21.05.2006, 12:50
да решение работает. Большое спасиб!!
Я запостил в баг-треккер
http://bugs.typo3.org/view.php?id=3527
В t3lib/jsfunc.validateform.js есть еще одна проблемма, которая
проявляется в TYPO3 4.0. Когда в форме ставишь "обязательное поле",
например "Email: | *_EMAIL=input,40", то проверка правильности _EMAIL
тоже не работает. Найдите в файле t3lib/jsfunc.validateform.js блок (в
оригинале номер строки 57):
if (specialMode) {
//index++; // <-- закомментируйте эту строку
theField = split(theFieldlist, ",", index);
}
Проблема решена.
Файл jsfunc.validateform.js с исправлениями
17
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot