PHP возиться с кодировкой HTML Charset - PullRequest
1 голос
/ 21 сентября 2011

У меня очень странная проблема.У меня есть сайт, который содержит несколько немецких букв, и когда это только HTML без php, символы являются свойством, отображаемым с кодировкой, когда я изменяю его на UTF-8, они не отображаются, и вместо ... я получаю �.Когда я помещаю html в php и запускаю его с Zend studio на Wamp с кодировкой charset = iso-8859-1, я получаю ½ вместо Ö (хочу добавить, что это же Ö является значением переключателя),Когда он находится в теге

, он отображается правильно.Можете ли вы сказать мне, как решить эту проблему.Я смотрю на другие сайты, и они имеют кодировку UTF-8 и правильно отображают тот же символ.Я пытался изменить кодировку php edior, но я полагаю, это не имеет значения -> все правильно отображается в редакторе Zend Studio ... Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 21 сентября 2011

Возможно, вы пришли, чтобы смешать типы кодирования. Например. Страница, которая отправляется как iso-8859-1, но получает кодировку текста UTF-8 из MySQL или XML, обычно завершается ошибкой.

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

Если вы отправите его как iso-8859-1, ваш ввод от пользователя также будет iso-8859-1.

header("Content-type:text/html; charset: iso-8859-1");

И если mysql отправляет latin1, вам не нужно ничего делать.

Но если ваш ввод не iso-8859-1, вы должны преобразовать его перед отправкой пользователю или адаптировать его к Mysql перед сохранением.

mb_convert_encoding($text, mb_internal_encoding(), 'UTF-8'); // If it's UTF-8 to internal encoding

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


Это внутренняя кодировка, которую я выбрал для использования.

mb_internal_encoding('iso-8859-1'); // Internal encoding

Это код, который я использую.

mb_language('uni'); // Mail encoding
mb_internal_encoding('iso-8859-1'); // Internal encoding
mb_http_output('pass'); // Skip

function convert_encoding($text, $from_code='', $to_code='')
{
    if (empty($from_code))
    {
        $from_code = mb_detect_encoding($text, 'auto');
        if ($from_code == 'ASCII')
        {
            $from_code = 'iso-8859-1';
        }
    }

    if (empty($to_code))
    {
        return mb_convert_encoding($text, mb_internal_encoding(), $from_code);
    }
    return mb_convert_encoding($text, $to_code, $from_code);
}

function encoding_html($text, $code='')
{
    if (empty($code))
    {
        return htmlentities($text, ENT_NOQUOTES, mb_internal_encoding());
    }

    return mb_convert_encoding(htmlentities($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}
function decoding_html($text, $code='')
{
    if (empty($code))
    {
        return html_entity_decode($text, ENT_NOQUOTES, mb_internal_encoding());
    }

    return mb_convert_encoding(html_entity_decode($text, ENT_NOQUOTES, $code), mb_internal_encoding(), $code);
}
1 голос
/ 21 сентября 2011

Можете ли вы проверить, каково значение заголовка HTTP Charset в заголовках ответа.Хотя информация старая (2009), я не знаю, сохраняется ли она по-прежнему: кодировка по умолчанию в PHP - UTF-8, если вы не предоставляете заголовок типа контента с помощью charset. Источник

Следовательно, установите заголовок явно:

header("Content-type:text/html; charset: iso-8859-1");
0 голосов
/ 21 сентября 2011

Обновлено Мне нужно, чтобы кодирование / декодирование не запуталось.

Когда вы находитесь в PHP, попробуйте декодировать строку в UTF-8 перед выводом.

$str = 'I ãm UTF-8';
echo(utf8_decode($str));

Это сработало для меня:

<?php $str = 'I ãm UTF-8: ÖMG!'; ?>
Test: <input type = 'text' value = '<?php echo(htmlspecialchars(utf8_decode($str))); ?>'>

Значение на входе (через Cut n Paste):

Я UTF-8: ÖMG!

0 голосов
/ 21 сентября 2011

Почему бы вам не использовать

&Ouml; 

вместо твоего Ö?

...