У меня есть эта очень странная проблема. У меня есть сайт, содержащий несколько немецких букв, и когда это только html без php, символы отображаются с кодировкой, когда я меняю его на UTF-8, они не отображают, а вместо … я получаю . Когда я помещаю html внутри php и запускаю его с помощью студии Zend на Wamp с кодировкой charset = iso-8859-1, я получаю � вместо Ö (я хочу добавить, что это то же самое … является значением переключателя) , Когда он находится в
тег отображается правильно. Можете ли вы рассказать мне, как исправить эту проблему. Я смотрю на другие сайты, и они кодируют UTF-8 и правильно отображают один и тот же символ. Я попытался изменить кодировку php edior, но это не имеет значения, я полагаю -> все правильно отображается внутри редактора Zend Studio … Спасибо заранее.
Вы, вероятно, пришли, чтобы смешивать типы кодирования. Например. Страница, которая отправляется как iso-8859-1, но получает кодировку UTF-8 из MySQL или XML, как правило, терпит неудачу.
Чтобы решить эту проблему, вы должны сохранить контроль над типом входных ecodings в зависимости от типа кодировки, которую вы выбрали для использования внутри.
Если вы отправляете его как 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
Короткое это означает, что вы всегда должны иметь преобразованный вход, чтобы соответствовать внутреннему кодированию и преобразованию вывода в соответствии с внешней кодировкой.
Это внутренняя кодировка, которую я выбрал использовать.
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); }
Вы можете проверить, что является значением заголовка HTTP-заголовка в заголовках ответов. Хотя информация старая (2009), я не знаю, сохранилась ли она: кодировка по умолчанию в PHP – это UTF-8, если вы не предоставляете заголовок типа содержимого с кодировкой. Источник
Следовательно, явно задайте заголовок:
header("Content-type:text/html; charset: iso-8859-1");
Обновлено Мне нужно, чтобы мой кодированный / декодированный текст был несовместим.
Когда вы находитесь в 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):
Я ãm UTF-8: ÖMG!
Почему бы вам не использовать
Ö
вместо вашего …?