Просмотр полной версии : utf8 - при сохранении урезает строку
И снова про кодировку.
Форум читал.
typo3 4.0.3
php 4.4.4
Mysql 4.1.22
phpmyadmin показывает character set везде utf8, collation везде utf8_unicode_ci.
$TYPO3_CONF_VARS['SYS']['setDBinit'] = 'SET NAMES utf8;';
(вариант: $TYPO3_CONF_VARS['SYS']['setDBinit'] = 'SET NAMES utf8;'.chr(10).'SET CHARACTER SET utf8;')
$TYPO3_CONF_VARS['BE']['forceCharset'] ='utf-8';
$TYPO3_CONF_VARS['SYS']['multiplyDBfieldSize'] = 1;
Например, в таблице be_users поле username varchar(20) (utf8_unicode_ci). При сохранении через BE имя пользователя русскими буквами без ошибок молча урезается до 10 символов.
Если через phpmyadmin записать туда "длинное_русское_имя" - в BE оно корректно читается и показывается, но при попытке изменить и сохранить опять урезается.
Что я упустил?
Pavel Antonov
09.01.2007, 02:44
Сталкивался... всех условий вспомнить не могу, но причина в том, что валидация полей TYPO3 работает "по-байтово". Чем грозит, думаю обяснять не нужно.
Почему так, не разбирался. Возможно не совсем корректно настроен PHP (не корректная поддержка UTF-строк). Если причина в PHP и решите с помошью настроек, просьба отписать в этот тред... Кстати баг репорт TYPO3 не смотрели?
Быстрое решение:
поправить TCA увеличив размеры в двое.
Прописать в localconf.php:
$TCA['be_users']['columns']['username']['config']['size'] = 40;
Так же для других таблиц...
Спасибо за наводку, покопался.
в t3lib/class.t3lib_tcemain.php функция checkValue_input:
// Secures the string-length to be less than max. Will probably make problems with multi-byte strings!
if (intval($tcaFieldConf['max'])>0) {$value = substr($value,0,intval($tcaFieldConf['max']));}
Этот substr, как и предупреждается, режет utf8-строку из поля ввода побайтово.
Дальше варианты:
1) Если руками заменить на mb_substr с указанием utf-8 - работает нормально.
2) Если включить в php.ini
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2
то поля ввода обрабатываются тоже правильно, но взамен слетает кодировка в clickmenu.
Куда копать дальше?
Valery Romanchev
13.01.2007, 19:18
похоже - это minor баг
так что ему прямая дорога в баг трекер
по mb_substr и checkValue_input
там есть 2 бага, но не те
http://bugs.typo3.org/view.php?id=2776
http://bugs.typo3.org/view.php?id=2020
Логично использовать t3lib_cs::substr, отписал баг репорт #4781.
У себя пропатчил checkValue_input() так:
// Secures the string-length to be less than max. Will works with multi-byte strings!
if (intval($tcaFieldConf['max'])>0) {
if (!is_object($this->csConvObj)) {
if (TYPO3_MODE=='FE') {
$this->csConvObj = &$GLOBALS['TSFE']->csConvObj;
} elseif (is_object($GLOBALS['LANG'])) { // BE assumed:
$this->csConvObj = &$GLOBALS['LANG']->csConvObj;
} else { // The object may not exist yet
$this->csConvObj = &t3lib_div::makeInstance('t3lib_cs');
}
}
if (TYPO3_MODE=='FE') {
$charset = $GLOBALS['TSFE']->renderCharset;
} elseif (is_object($GLOBALS['LANG'])) { // BE assumed:
$charset = $GLOBALS['LANG']->charSet;
} else { // best guess
$charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];
}
$value = $this->csConvObj->substr($charset,$value,0,intval($tcaFieldConf['max']));
}
Ну и добавил var $csConvObj; в класс.
Не знаю только, стоило столько городить или достаточно было парой строк ограничиться.
Pavel Antonov
27.08.2007, 22:02
http://bugs.typo3.org/view.php?id=5618
А баг и ныне там...
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot