Некоторые из моих скриптов используют другую кодировку, и когда я пытаюсь их объединить, это становится проблемой.
Но я не могу изменить используемую ими кодировку, вместо этого я хочу изменить кодировку результата из сценария A и использовать его как параметр в сценарии B.
Итак: есть ли простой способ изменить строку с UTF-8 на ISO-88591 в PHP? Я просмотрел utf_encode и _decode, но они не делают то, что я хочу. Почему не существует какой-либо функции "utf2iso ()" или подобной?
Я не думаю, что у меня есть символы, которые нельзя записать в формате ISO, так что это не должно быть большой проблемой.
Стоит отметить, что PHP продолжает переходить на utf-8 внутри, поэтому любые строки, которые у вас есть, вероятно, исходят извне. Установите cURL, функции доступа к файлам, потоки, PDO / MySQL или любой другой API для доступа к внешним данным, чтобы использовать UTF-8, чтобы он уже был правильным, когда PHP получит его.






Вам нужно использовать пакет iconv, в частности его функцию iconv.
Взгляните на iconv() или mb_convert_encoding().
Кстати: почему бы вам не работать utf8_encode() и utf8_decode()?
utf8_decode — Converts a string with ISO-8859-1 characters encoded with UTF-8 to single-byte ISO-8859-1
utf8_encode — Encodes an ISO-8859-1 string to UTF-8
Так по сути
$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded
$iso88591_1 = utf8_decode($utf8);
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8);
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8');
$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded
$utf8_1 = utf8_encode($iso88591);
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591);
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1');
все должны делать то же самое: utf8_en/decode() не требует специального расширения, mb_convert_encoding() требует ext / mbstring, а iconv() требует ext / iconv.
Спасибо за хороший ответ, и вы, и остальные здесь правы: utf8_decode (), похоже, выполняет свою работу. Должно быть, были какие-то проблемы с файлами или моим браузером. По крайней мере, я больше не могу воспроизводить ошибки ... (Может, я что-то не так сделал с настройками кодировки браузера?)
Для записи: я сталкивался с подобной ситуацией, но я заметил, что iconv был дважды вызван (вложен) в одну и ту же str var. После того, как я удалил тот первый звонок, работает как шарм. (utf8_decode и mb_convert_enconding не используются)
Этот совет помог мне решить специфическую проблему, когда строка UTF-8 ("Atlántico") сначала была буквально закодирована в ISO-8859-1 (выглядела как "Atlántico"), а затем эти однобайтовые символы были перекодированы обратно в UTF-8 (выглядел так же, как «Atlántico», но на этот раз каждый символ был закодирован в UTF-8). utf8_decode () помог, потому что он декодировал символы UTF-8 в их буквальные заменители ANSI, которые затем каким-то таинственным образом правильно считывались и отображались как символы UTF-8. Есть в этом смысл или нет? Хм..
Во-первых, не используйте разные кодировки. Это приводит к беспорядку, и UTF-8 определенно тот, который вы должны использовать везде.
Скорее всего, вы вводите не ISO-8859-1, а что-то еще (ISO-8859-15, Windows-1252). Чтобы конвертировать из них, используйте iconv или mb_convert_encoding.
Тем не менее, utf8_encode и utf8_decode должны работать для ISO-8859-1. Было бы неплохо, если бы вы могли опубликовать ссылку на файл или примерную строку uuencoded или base64, для которой преобразование не выполняется или дает неожиданные результаты.
iconv или mb_convert_encoding? iconv требует знания входной кодировки, что может быть не так.
@Benubird. Если вы угадываете кодировку, вы, вероятно, столкнетесь с еще более серьезными проблемами (теперь это нелегко воспроизвести, так как это может зависеть от частоты символов). Но вы правы, mb_convert_encoding определенно относится к этому ответу. Добавлен.
«Избегайте кодирования, отличного от UTF8» - в целом хороший совет, но иногда это невозможно. Например, мы пытаемся заставить работать стороннюю интеграцию, когда сторона требует XML в формате Latin 1.
Я использовал:
function utf8_to_html ($data) {
return preg_replace(
array (
'/ä/',
'/ö/',
'/ü/',
'/é/',
'/à/',
'/è/'
),
array (
'ä',
'ö',
'ü',
'é',
'à',
'è'
),
$data
);
}
Я использую эту функцию:
function formatcell($data, $num, $fill = " ") {
$data = trim($data);
$data=str_replace(chr(13),' ',$data);
$data=str_replace(chr(10),' ',$data);
// translate UTF8 to English characters
$data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
$data = preg_replace("/[\'\"\^\~\`]/i", '', $data);
// fill it up with spaces
for ($i = strlen($data); $i < $num; $i++) {
$data .= $fill;
}
// limit string to num characters
$data = substr($data, 0, $num);
return $data;
}
echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx
Проверьте мою функцию в моем блоге http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8
function parseUtf8ToIso88591(&$string){
if (!is_null($string)){
$iso88591_1 = utf8_decode($string);
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string);
$string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');
}
}
Пожалуйста, попробуйте добавить некоторые пояснения к коду, чтобы повысить образовательную ценность сообщения.
установить метатег в заголовке как
<meta http-equiv = "Content-Type" content = "text/html; charset=ISO-8859-1" />
используйте ссылку http://www.i18nqa.com/debug/utf8-debug.html, чтобы заменить нужный символ символа.
затем используйте str_replace, например
$find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash
$replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”');
$content = str_replace($find, $replace, $content);
Это метод, который я использую и очень помогаю. Спасибо!
В моем случае после загрузки файлов с именами, содержащими эти символы, они даже не были видны с помощью Filezilla! В файловом менеджере Cpanel они показывались? (под черным фоном). И эта комбинация позволила правильно отобразить его в браузере (HTML-документ закодирован по западному образцу):
$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path']))) );
Намного лучше использовать
$ value = mb_convert_encode ($ value, 'HTML-ENTITIES', 'UTF-8');
Особенно, когда вы используете вызов AJAX для отправки символов ISO-8859-1. Он работает для китайского, японского, чешского, немецкого и многих других языков.
Для всех, кто использует это решение, имейте в виду, что функция на самом деле mb_convert_encoding.
Используйте html_entity_decode() и htmlentities().
$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1');
htmlentities() форматирует ваш ввод в UTF8, а html_entity_decode() форматирует его обратно в ISO-8859-1.
utf8_decode должен быть именно вашим utf2iso?!?