Проблема отображения международных шрифтов с UTF-8 - PullRequest
0 голосов
/ 15 мая 2009

Мы разработали приложение PHP-MySQL на двух языках - английском и гуджарати. Язык гуджарати содержит символы, для правильного отображения которых требуется кодировка UTF-8 в Юникоде.

Приложение отлично работает на моем локальном хосте на базе Windows и на моем тестовом сервере на базе Linux в Интернете.

Но когда я передаю приложение на веб-сервер клиента (на основе linux redhat), символы гуджарати не отображаются должным образом.

Я проверил необработанные данные из обеих баз данных (на моем веб-сервере и на веб-сервере клиента) - они абсолютно одинаковые. Однако дисплей отличается. На моем сервере шрифты отображаются отлично, но когда я пытаюсь получить доступ к клиентской копии приложения, отображение шрифта гуахарати выглядит неправильно.

Поскольку я тестирую оба этих экземпляра установки с одного и того же компьютера и одного и того же браузера, проблема заключается не в несовместимости браузера и не в коде. Я считаю, что нужно выполнить некоторые настройки сервера, которые я упускаю.

Можете ли вы помочь, пожалуйста.

Спасибо

Винаяк

UPDATE

Спасибо. Мы попробовали предложения по настройке apache и php, предоставленные членами сообщества SO. Но проблема остается.

Чтобы разбить проблему, мы рассмотрели различные этапы, через которые проходят данные.

Две базы данных (на стороне клиента и на нашей стороне) идентичны. В них нет разницы.

Следующим шагом в этом приложении является выполнение запроса, который восстанавливает данные, создает XML-файл и сохраняет его.

Этот XML-файл затем отображается на странице PHP.

Мы определили, что проблема в том, что существует разница в создаваемом файле XML. Код, используемый для создания файла XML, выглядит следующим образом:

function fnCreateTestXML($testid)
{
    $objQuery = new clsQuery();
    $objTest = new clsTest();
    $setnames = $objQuery->fnSelectRecords("tbl_testsets", "setnumber", "");
    $queryresultstests = $objQuery->fnSelectRecords("tbl_tests", "", "");
    if($queryresultstests)
    {

        foreach($queryresultstests as $queryresulttest)
        {
            foreach($setnames as $setname)
            {
                //Creating Root node test and set its attribute 
                $doc = new DomDocument('1.0','utf-8');
                $root = $doc->createElement('test');
                $root = $doc->appendChild($root);
                //and so on

//Saving XML on the disk
                $xml_create = $doc->saveXML();
                $testname = "testsxml.xml";
                $xml_string = $doc->save($testname);

Есть идеи ??

Спасибо

Винаяк

Ответы [ 5 ]

2 голосов
/ 15 мая 2009

Ответ почти наверняка лежит в заголовках, отправляемых с веб-страницами. Для диагностики подобных проблем я нашел полезным установить дополнение Firefox «Live HTTP Headers» .

Установите это дополнение, затем включите его и перезагрузите страницу с веб-сервера клиента и с вашего собственного.

Вероятно, вы увидите, что страница, обслуживаемая вашим веб-сервером, имеет заголовок:

Content-Type: text/html; charset=UTF-8

Принимая во внимание, что когда он обслуживается клиентским веб-сервером, он говорит:

Content-Type: text/html

Способ, которым я бы порекомендовал исправить это, заключается в том, чтобы вы явно установили заголовок, чтобы указать utf-8 на каждой странице вашего приложения. Это затем изолирует ваше приложение от будущих изменений конфигурации на стороне клиента.

Для этого позвоните

header('Content-type: text/html; charset=utf-8');

на каждой странице перед отправкой каких-либо данных.

2 голосов
/ 15 мая 2009

Поскольку вы заявили, что он работает в ваших средах разработки, а не на ваших клиентах, вы можете проверить на клиентах Apache AddDefaultCharset и установить его в UTF-8, если это еще не сделано. (Предполагая, что они используют Apache.)

Я стараюсь убедиться, что следующие шаги проверены

  1. Заголовок PHP отправляется в UTF-8
  2. Метатег установлен в UTF-8 (Content-Type)
  3. Память установлена ​​в UTF-8
  4. Выход сервера настроен на UTF-8
  5. Убедитесь, что ваши файлы php-кода закодированы в UTF8 с BOM (Byte Order Mark)
0 голосов
/ 07 января 2014

Пожалуйста, используйте этот метатег: meta http-equ = "Content-Type" content = "text / html; charset = UTF-8"

Убедитесь, что используете этот код в php: mysql_query ("set character_set_results = 'utf8'");

0 голосов
/ 15 мая 2009

Проверьте настройки набора символов на экземпляре БД на компьютере клиента:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Прежде чем выполнять какие-либо запросы на выборку текста, попробуйте выполнить:

SET NAMES utf8
SET CHARACTER SET utf8

Если это работает, вы можете добавить в my.cnf на компьютере клиента следующее:

[mysqld]
collation_server=utf8_unicode_ci
character_set_server=utf8
default-character-set=utf8
default-collation=utf8_general_ci
collation-server=utf8_general_ci
0 голосов
/ 15 мая 2009

Убедитесь, что заголовки ответа верны - в Content-type должен быть UTF-8.

...