12.02.2007
Друзья и коллеги, Вероятно эта проблема уже упомянута в этом форуме, но в делах программинга я не сведущий, поэтому мог и не понять написанного. Есть проблема при сохраненении русского текста в БД. Проблема актуальна для версии 5.0.x включая 5.0.3 RC2. В стандартной сборке (единый дистрибутив с аппачем, и MySQL) генерация БД происходит в latin1 кодировке, поэтому, чтобы небыло названий аккаунтов типа "Владимир Влади&?" я ставлю MySQL отдельно и ставлю UTF-8 по умолчанию. Тогда вырисовывается ещё нюанс: Если мы, на форме редактирования деталей, вводим в какое нибудь поле (например, Имя Аккаунта) определённое количество русских символов (для каждого поля количество своё, но, например, поле "Форма собственности" Аккаунта позволяет не больше 7) и нажимаем "Сохранить", то изменения не доходят до БД. Обновляем форму - пусто! На полной форме редактирования позволены достаточно длинные значения, и в случае сбоя отсутствие изменений видно сразу, а вот если использовать быстрое редактирование (ссылочка "Edit" в углу каждого поля), то символов проходит гораздо меньше (например, при полном редактировании имя аккаунта может быть длинной, порядка, 30 символов, а при быстром - всего 15, иначе все изменения просто исчезают) и после нажатия "Сохранить" форма отображает изменения, но после обновления страницы всё опять исчезает. Есть все основания считать, что данные теряются на этапе формирования запроса к БД. Дело в том, что специалистов в PHP программировании и технологии Аякс у нас нет, поэтому просим о помощи, а так же готовы поделиться опытом решения других проблем.
13.02.2007
Поигрался с демкой на сайте - кое что понял.. Если правлю в "быстрой" правке, то информация в БД сохраняется в виде.. ни за что бы не поверил - HTML entity! т.е. #1055;#1072;#1090;.. По 5 байт на букву Русскую. Абалдеть! Раньше точно сохранялось всё в UTF-8. А если править в режиме обычной правки, то.. у меня демка вылетает на сайте:) Подозреваю, что в этом случае будет в Юникоде сохраняться.. Из-за этого и разница в длине значений. Теперь о "пропадании" при превышении длины. Специально пробовал - просто обрезаются "лишние" символы. (Контрагент "Патэрсон" в демке - в нём ещё обрезалась часть имени). Для эксперимента увеличил размер поля "Форма собственности" в БД до 255 символов и получилось сохранить длинную форму собственности ("Очень длинная форма" в том же "Патэрсоне"). Демка 5.0.1, насколько я помню. В общем - с размерами полей причина ясна, а значит исправить можно (когда именно - обещать не могу). А с "пропаданием" данных - либо локальная проблема, либо специфичная для 5.0.3 (а раньше было такое у Вас?).

Сообщение отредактировано: justoff, в: 2007/02/13 22:37
21.02.2007
Видимо та же проблема проявляется с выпадающими списками - установленные русскоязычные значения сбрасываются при следующем редактировании. Например, поле "тип" в сделке - если внести в этот выпадающий список (через PicklistEditor) строки на русском, то в базу они попадают в виде "& #1058;& #1077;...". Затем, при редактировании сделки указываем в поле "тип" значение на русском, то оно сохраняется, однако в базу при этом попадает текст в utf-8. При следующем открытии сделки на редактирование тип сбрасывается в пустое значение, так как текст из базы в формате utf-8 не совпадает с текстом строк выпадающего списка в формате html entities. Удалось раскопать, как это получается. Первоисточник - это Ajax-формы редактирования данных, в том числе и ввод строк в PicklistEditor. Из JavaScript строки попадают в виде "%u0422%u0435...", затем они обрабатываются функцией utf8RawUrlDecode (includeutilsutils.php). И на выходе уже получаются "Те...". Судя по тексту этой функции, она преобразует исходные "%u0422" в html entities вида "Т", а затем пытается преобразовать в юникод ($decodedStr .= utf8_encode ($entity)) - однако это последнее пробразование не работает, и после него остается та же строка с "& #1058...". Как это исправить пока не понял, может у кого-нибудь есть идеи на этот счет? Сообщение отредактировано: seb, в: 2007/02/21 13:39

Сообщение отредактировано: seb, в: 2007/02/21 13:40
21.02.2007
Спасибо, Борис, за исследование - у самого времени не хватает - оно помогло решить проблему. Дело в том, что автор функции, похоже, преследовал совсем другую цель (или просто ошибался) - функция [b]utf8_encode[/b] служит для перекодировки из ISO-8859-1 в UTF-8. Естественно html-entity вида &#00xx остаётся без изменений. А нужна нам функция [b]html_entity_decode[/b], которая, собственно и занимается расшифровкой html-entity. В итоге, заменив в фукнции [b]utf8RawUrlDecode[/b] строку [code:1]$decodedStr .= utf8_encode ($entity);[/code:1] на строку [code:1]$decodedStr .= html_entity_decode ($entity, ENT_NOQUOTES, "UTF-8"«»);[/code:1] получаем решение проблемы. Можно проверить в демке - после редактирования в "быстрой" правке текст правильно сохраняется, и отображается впоследствии на странице. При просмотре HTML-кода видно, что данные теперь в UTF-8, а не в html-entity, как были раньше. Ещё раз спасибо Борису за указание на место ошибки. P.S. Для работы в не-UTF-8-среде, наверняка нужен какой-то обвес. У меня просто времени не было. Сообщение отредактировано: justoff, в: 2007/02/21 18:44

Сообщение отредактировано: justoff, в: 2007/02/22 16:00
23.02.2007
К сожалению, этот вариант я у себя пробовал - не помогло, видимо тут еще дело в версии или сборке php. У меня выдает сообщение cannot yet handle MBCS in html_entity_decode()! Т.е. фунция html_entity_decode не работает с юникодом. У меня все работает через Денвер, версия php 4.4.2.
03.03.2007
Антон, если есть возможность, сообщите какая у Вас версия php и с каким набором модулей он собран. Что-то я никак не могу справиться с проблемой перекодировок.
05.03.2007
Вот ссылка на [url=http://www.vtiger.ru/demo/out.php]phpinfo()[/url]. Надеюсь, поможет.
23.01.2008
Очень полезная инструкция, но не пойму где конкретно находится файл, который необходимо исправлять. Не очень я разбираюсь. Заранее спасибо за помощь.
27.05.2009
Здравствуйте уважаемые гуру! Установил весь комплект 5.0.4 из bin файла под Linux. Накатил русский пак и патч. Вроде все работает, но любую новую запись по русски после сохранения выводит в виде "????????" (знаками вопроса). В таблице в базе через phpmyadmin в соответствующем поле тоже вижу "????????" Подскажите в каком месте покопать? [img size=435]http://www.vtiger.ru/components/com_joomlaboard/uploaded/images/contr.jpg[/img] Сообщение отредактировано: Cherep, в: 2009/05/27 10:14

Сообщение отредактировано: Cherep, в: 2009/05/27 10:15
Текст сообщения: