1 (изменено: Sequr, 2008-06-20 15:48:18)

Тема: Проблема отображения французских слов

Здравствуйте, дорогие мои.
Проблема моя давняя и насущная.

Итак, имеется сайт, на котором я размещаю инфу, в том числе и на французском языке.
А в этом языке есть такие слова как: aujourd'hui, voil?, s?par?s, s'arr?te и т.д.
Так вот отображение сих слов на сайте меня не устраивает.
Вместо них получается вот что: aujourd\'hui, voil?, s?par?s, s\'arr?te

Как можно заметить, все слова, в которых нет апострофа, отображаются иногда грамотно.
Иногда, потому что порой движок меняет, к примеру, слово pr?f?re на prйfиre
Но вот где он присутствует, движок добавляет перед ним левый слэш.
От себя добавлю, что есть в html такая штука как

voil?

,

s?par?s

,

s'arr?

, заменяющая подобные буквы.
А нет ли такого кода, чтоб заменял апостроф?


phpMyAdmin - 2.11.4
Версия MySQL-клиента: 5.0.51a
MySQL-кодировка:  UTF-8 Unicode (utf8)
PHP Version 5.2.5
Движок сайта: musicbox 2.3.5
Кодировка БД: latin1_swedish_ci (почему-то)

Может просто изменить кодировку БД?
Если так, то на какую менять и как именно это лучше сделать?

2

Re: Проблема отображения французских слов

Sequr
По идее многоязычные данные следует хранить в utf8, но перекодировка процесс сложный и на форуме его описать нет возможности из-за большого количества нюансов.

Не знаю какую кодировку надо использовать для французского, но предполагаю, что в используемой вами latin1, просто отсутствуют соответствующие символы, вследствии чего они заменяются.

Посмотрите с помощью phpMyAdmin на то как данные выглядят в БД. Если там апострофы предваряются косой чертой, то вероятно двойное применение функции PHP, addslashes(). Это может случиться если в конфигурации PHP включена директива magic_quotes_gpc, но скрипт при вставке данных это не проверяет.

Для информации. Апостроф, одновременно с некоторыми другими символами HTML разметки, можно заменять на HTML сущности с помощью функции PHP: htmlspecialchars($str, ENT_QUOTES).

3 (изменено: Sequr, 2008-06-21 01:10:37)

Re: Проблема отображения французских слов

Hanut сказал:

Посмотрите с помощью phpMyAdmin на то как данные выглядят в БД. Если там апострофы предваряются косой чертой, то вероятно двойное применение функции PHP, addslashes().

В phpMyAdmin всё тоже самое. Левый слэш.

Hanut сказал:

Это может случиться если в конфигурации PHP включена директива magic_quotes_gpc, но скрипт при вставке данных это не проверяет.

Это исправимо?
Я немного поэкспериментировал. В phpMyAdmin поменял кодировку БД на utf8_unicode_ci, хотя все поля таблицы остались в latin1_swedish_ci. Попробовал убрать в phpMyAdmin все эти самый слэши, а апострофы оставить. Каково же было моё удивление, когда в результате слова с апострофами отобразились на сайте корректно.
Но и это не всё! В phpMyAdmin слова вроде t?te отображаются нормально, а на сайте - нет ( tкte ).
И вот тут я зашёл в тупик.


Hanut сказал:

Для информации. Апостроф, одновременно с некоторыми другими символами HTML разметки, можно заменять на HTML сущности с помощью функции PHP: htmlspecialchars($str, ENT_QUOTES).

Спасибо. Хотя мало что понял.

4

Re: Проблема отображения французских слов

Sequr сказал:

В phpMyAdmin поменял кодировку БД на utf8_unicode_ci, хотя все поля таблицы остались в latin1_swedish_ci

Это не имеет смысла, только вносит еще больше путаницу, так как смена сопоставления не перекодирует данные.

Sequr сказал:

В phpMyAdmin слова вроде t?te отображаются нормально, а на сайте - нет ( tкte ).

Это существенно, так как означает, что кодировка latin1 нормально отображает французские символы, но на сайте выводится в кодировке windows-1251, из-за чего символ "?" заменяется на кирилическую "к". Если у вас сайт в кодировке windows-1251, то вывести символы latin1 не удастся.

Постарайтесь разобраться в какой кодировке должен быть ваш сайт и в случае необходимости двуязычяя - вариант только utf8. Но портебуется заранее узнать работает ли используемый скрипт в данной кодировке.

Решение по экранирующим косым чертам.
При наличии доступа к конфигурационному файлу PHP (php.ini), отключите директиву magic_quotes_gpc:
magic_quotes_gpc = Off

Второе решение - изменить код скрипта, но здесь вы только сами сможете что-то сделать.

5

Re: Проблема отображения французских слов

magic_quotes_gpc выключил.
Теперь интересная штука получается.
Если html-код с подобными словами вставлять при помощи движка, то проблемы остаются. Как со слэшем (кстати при каждом изменении кода добавляется ещё один слэш), так и со сложными буквами.
А вот если вставить исходный код непосредственно в phpMyAdmin, то результат получается восхитительный. Всё отображается правильно!

6

Re: Проблема отображения французских слов

Попробуйте отключить эти также.
magic_quotes_runtime = Off
magic_quotes_sybase = Off

Чтобы узнать кодировку соединения MySQL, выполните запрос:

SHOW VARIABLES LIKE 'char%';

7

Re: Проблема отображения французских слов

Hanut сказал:

Попробуйте отключить эти также.
magic_quotes_runtime = Off
magic_quotes_sybase = Off

Чтобы узнать кодировку соединения MySQL, выполните запрос:

SHOW VARIABLES LIKE 'char%';

Они уже были выключены.

character_set_client      utf8
character_set_connection     utf8
character_set_database     latin1
character_set_filesystem     binary
character_set_results     utf8
character_set_server     latin1
character_set_system     utf8

8

Re: Проблема отображения французских слов

Sequr
После изменения в php.ini перезагрузили Apache? Должны экранирующие черты исчезнуть.

С latin1 должно работать. Сами страницы сайта в какой кодировке?

9

Re: Проблема отображения французских слов

Кодировка сайта - windows-1251
Проблемы остались. Причем с каждым разом этих слэшей всё больше.
Теперь странная вещь нарисовалась.
Если делать изменения в phpMyAdmin, то в Админпанели движка всё хорошо, но на сайте опять проблемы.
Буду переустанавливать движок.

10

Re: Проблема отображения французских слов

Sequr
На страницах с кодировкой windows-1251 невозможно отображение символов из latin1, так как на их месте в ASCII таблице они совсем другие.

Посмотрите в phpinfo() состояние директивы magic_quotes_gpc.

<?php phpinfo(); ?>