Неверное отображение первой буквы слова в заголовках

Главные вкладки

Аватар пользователя Гость Гость (не проверено) 6 августа 2005 в 17:49

Поставил тему SpreadFirefox, почему то при перемещении по таксономии на странице неверно отображается первая буква последнего слова в пути (таксономии), рисуется ромбик...
Примерно так - "Главная » форумы » Основная » Разное » �драсте! ". Этот баг замечен только в пути таксономии, во всех остальных местах все отображается нормально...
Видимо проблему надо искать в шаблонах этой темы, но где?

Лучший ответ

Аватар пользователя Nick Nick 8 августа 2005 в 13:29

Неверная работа этой фкнкции - побочный эфект.

1. Эта функция с русскими буквами вообще работать не должна.
http://ru3.php.net/manual/en/function.ucwords.php
"Returns a string with the first character of each word in str capitalized, if that character is alphabetic."

Русские символы в кодировке utf8 вряд ли попадают под понятия alphabetic
Вот небольшой тест в подтверждение этой мысли:

nick@moon:~$ export LANG=ru_RU.UTF8
nick@moon:~$ locale
LANG=ru_RU.UTF8
LC_CTYPE="ru_RU.UTF8"
LC_NUMERIC="ru_RU.UTF8"
LC_TIME="ru_RU.UTF8"
LC_COLLATE="ru_RU.UTF8"
LC_MONETARY="ru_RU.UTF8"
LC_MESSAGES="ru_RU.UTF8"
LC_PAPER="ru_RU.UTF8"
LC_NAME="ru_RU.UTF8"
LC_ADDRESS="ru_RU.UTF8"
LC_TELEPHONE="ru_RU.UTF8"
LC_MEASUREMENT="ru_RU.UTF8"
LC_IDENTIFICATION="ru_RU.UTF8"
LC_ALL=
nick@moon:~$ php4
<?php print ucwords('раз два три четыре'); ?>
раз два три четыреnick@moon:~$
nick@moon:~$ php4
<?php print ucwords('Здрасте! здрасте!'); ?>
Здрасте! здрасте!nick@moon:~$
$ php4
<?php print ucwords('ucwords? are you really working? YES!'); ?>
Ucwords? Are You Really Working? YES!nick@moon:~$

Как видим функция вполне себе понимает utf8 и ничего с ним не делает.
А ошибка у вас на сайте берется из-за того, что функция, вероятно, не понимает, что у вас utf8.

А связано это, скорее всего, с тем, что у вас mysql версии >=4.1 (ну не зря же я про версию спрашивал). Начиная с этой версии, в mysql добавили перекодировку. Т.е. пользователь может выбирать в какой кодировке данные хранятся в какой выдаются (перекодировка на лету). imho проблем от этого добавилось гораздо больше, чем решилось, но не об этом речь.
И, вероятно, mysql выдает информацию в какой-нибудь неutf8 кодировке Точнее... она так думает, что не в utf8... Там возникают какие-нибудь постоянные перекодировки, которые и слегка портят информацию... Например, сайт отдает информацию в utf8, а mysql думает, что это cp1251, а сохраняет еще в чем-нибудь другом. И возвращает, думая, что это cp1251. Вообщем... Некоторый бардак получается Beee
Как это лечится описано здесь: http://drupal.ru/node/875/3550/#comment-3550 . При этом возможно придется перезалить локализацию и контент backup/restore. Соответственно, перед restore не забыть set charset utf8.

Впрочем... есть замечательная поговорка "не сломалось - не чини", поэтому, если вас все устраивает, то зачем что-то менять Smile

Удачи вам и вашему проекту! Smile

Комментарии

Аватар пользователя Гость Гость (не проверено) 7 августа 2005 в 16:49
Аватар пользователя Nick Nick 7 августа 2005 в 17:25

А мне кажется, что вполне себе причем. Тончее кодировка в mysql...

Впрочем, если вы так категорично заявляете, то наверно сами разбираетесь... В таком случае, я не намерен вас в чем то убеждать ...

p.s. по поводу сайта: сильно рекомендую избавится от горизонтальной прокрутки: это неудобно.
Также, советую сделать блоки с одной стороны и уменишить кол-во блоков. Надо всегда помнить, что блоки это всего лишь _вспомогательная_ информация. Она удобна лишь до того момента, пока не мешает читать основную...

Аватар пользователя Гость Гость (не проверено) 8 августа 2005 в 12:48

Проблема оказалась в функции ucwords($title), которую я нашел в файле page.tpl.php. Видимо с юникодом она не дружит, пришлось затереть.

Аватар пользователя Nick Nick 8 августа 2005 в 13:29

Неверная работа этой фкнкции - побочный эфект.

1. Эта функция с русскими буквами вообще работать не должна.
http://ru3.php.net/manual/en/function.ucwords.php
"Returns a string with the first character of each word in str capitalized, if that character is alphabetic."

Русские символы в кодировке utf8 вряд ли попадают под понятия alphabetic
Вот небольшой тест в подтверждение этой мысли:

nick@moon:~$ export LANG=ru_RU.UTF8
nick@moon:~$ locale
LANG=ru_RU.UTF8
LC_CTYPE="ru_RU.UTF8"
LC_NUMERIC="ru_RU.UTF8"
LC_TIME="ru_RU.UTF8"
LC_COLLATE="ru_RU.UTF8"
LC_MONETARY="ru_RU.UTF8"
LC_MESSAGES="ru_RU.UTF8"
LC_PAPER="ru_RU.UTF8"
LC_NAME="ru_RU.UTF8"
LC_ADDRESS="ru_RU.UTF8"
LC_TELEPHONE="ru_RU.UTF8"
LC_MEASUREMENT="ru_RU.UTF8"
LC_IDENTIFICATION="ru_RU.UTF8"
LC_ALL=
nick@moon:~$ php4
<?php print ucwords('раз два три четыре'); ?>
раз два три четыреnick@moon:~$
nick@moon:~$ php4
<?php print ucwords('Здрасте! здрасте!'); ?>
Здрасте! здрасте!nick@moon:~$
$ php4
<?php print ucwords('ucwords? are you really working? YES!'); ?>
Ucwords? Are You Really Working? YES!nick@moon:~$

Как видим функция вполне себе понимает utf8 и ничего с ним не делает.
А ошибка у вас на сайте берется из-за того, что функция, вероятно, не понимает, что у вас utf8.

А связано это, скорее всего, с тем, что у вас mysql версии >=4.1 (ну не зря же я про версию спрашивал). Начиная с этой версии, в mysql добавили перекодировку. Т.е. пользователь может выбирать в какой кодировке данные хранятся в какой выдаются (перекодировка на лету). imho проблем от этого добавилось гораздо больше, чем решилось, но не об этом речь.
И, вероятно, mysql выдает информацию в какой-нибудь неutf8 кодировке Точнее... она так думает, что не в utf8... Там возникают какие-нибудь постоянные перекодировки, которые и слегка портят информацию... Например, сайт отдает информацию в utf8, а mysql думает, что это cp1251, а сохраняет еще в чем-нибудь другом. И возвращает, думая, что это cp1251. Вообщем... Некоторый бардак получается Beee
Как это лечится описано здесь: http://drupal.ru/node/875/3550/#comment-3550 . При этом возможно придется перезалить локализацию и контент backup/restore. Соответственно, перед restore не забыть set charset utf8.

Впрочем... есть замечательная поговорка "не сломалось - не чини", поэтому, если вас все устраивает, то зачем что-то менять Smile

Удачи вам и вашему проекту! Smile

Аватар пользователя Гость Гость (не проверено) 8 августа 2005 в 17:55

OK. Спасибо, приму к сведению. Пока все работает нормально, править не буду, если возникнут еще траблы, то задумаюсь.