Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Изменение кодировки при помощи iconv


Автор: cardinal 5.10.2009, 23:20
Код

$block_body1 = "öäüßzeile1";
$block_body2 = "öäüßzeile2";

echo iconv("ISO-8859-1", "UTF-8", $block_body1);
echo iconv("UTF-8", "ISO-8859-1", $block_body2);


А на выходе только öäüßzeile1. То есть вторая строка не выдается вообще (вторая функция ничего не возвращает). Не понимаю почему...

Автор: unicross 5.10.2009, 23:31
Цитата(cardinal @  6.10.2009,  00:20 Найти цитируемый пост)
То есть вторая строка не выдается вообще (вторая функция ничего не возвращает). Не понимаю почему...

По умолчанию, если функция iconv() не может преобразовать символы, то она прекращает свое выполнение. Чтобы этого не было следует использовать флаги //TRANSLIT или //IGNORE. Например:
Код

echo iconv("UTF-8", "ISO-8859-1//IGNORE", $block_body2);

Описание функции iconv() здесь http://ru.php.net/manual/en/function.iconv.php

Автор: cardinal 6.10.2009, 00:24
unicross, спасибо. При помощи //IGNORE получил
öäüßzeile1zeile2

То есть умлауты из UTF-8 в ISO-8859-1 функцией iconv не переделать?

Вроде кстати с htmlspecialchars нужный вариант получается, но что-то неуверен...

p.s. php я так между делом использую, надо доделать просто одну вещь...

Автор: unicross 6.10.2009, 01:32
Цитата(cardinal @  6.10.2009,  01:24 Найти цитируемый пост)
То есть умлауты из UTF-8 в ISO-8859-1 функцией iconv не переделать?

Если эти символы входят в кодировку ISO-8859-1, то можно. 

UTF-8 способна вместить практически любую кодировку. Поэтому любую однобайтную кодировку можно преобразовать в UTF-8, но при обратной операции могут быть символы, которые не входят в однобайтную кодировку (в данном случае в ISO-8859-1) и они будут проигнорированы при наличии флага //IGNORE. Ведь более 65 тыс. символов не поместятся в 256...

В качестве примера создайте файл в кодировке UTF-8 без BOM (например, с помощью Notepad++) со сл. программой:
Код

<?php
// Файл в кодировке UTF-8 без BOM !!!
header("Content-Type: text/html; charset=iso-8859-1");
$text_UTF = "öäüßzeile1";
echo iconv("UTF-8", "ISO-8859-1//IGNORE", $text_UTF);
?>

В результате получим нормальный результат:
Код

öäüßzeile1


Все зависит от кодировки файла в котором находится строка. В вашем случае я так понимаю строки $block_body1 и $block_body2 содержат данные в кодировке ISO-8859-1, а не в UTF-8. Поэтому в первом случае нормальный результат, а во втором - проблемы с символами.

Если символы в однобайтную кодировку не входят, то можно преобразовать их в HTML-эквиваленты с помощью функции http://ru2.php.net/manual/en/function.htmlentities.php
Код

<?php
// Файл в кодировке UTF-8 без BOM !!!
header("Content-Type: text/html; charset=windows-1251");
$text_UTF = "öäüßzeile1";
$text_UTF = htmlentities($text_UTF, ENT_QUOTES, 'UTF-8');
echo iconv("UTF-8", "windows-1251//IGNORE", $text_UTF);
?>

Результат
Код

&ouml;&auml;&uuml;&szlig;zeile1

В этом случае символы в кодировку windows-1251 не входят, но мы заменили их на HTML-эквиваленты.

Автор: cardinal 6.10.2009, 08:57
Но ведь умлауты есть в http://de.wikipedia.org/wiki/ISO_8859-1?

Автор: unicross 6.10.2009, 14:02
Цитата(cardinal @  6.10.2009,  09:57 Найти цитируемый пост)
Но ведь умлауты есть в ISO_8859-1?

cardinal, если вы под словом "умлаут" подразмеваете буквы ä, ö и ü, то эти символы присутствуют в кодировке http://ru.wikipedia.org/wiki/ISO_8859-1 и нормально преобразовываются в (из) UTF-8 с помощью iconv() (примеры в моем посте выше, там с этими буквами все нормально).

Автор: Ипатьев 6.10.2009, 14:06
Цитата(cardinal @  5.10.2009,  23:20 Найти цитируемый пост)
То есть вторая строка не выдается вообще

А что вы от нее ожидали? что вы вообще хотели получить от этой второй строчки?

Автор: cardinal 6.10.2009, 19:29
Цитата(unicross @  5.10.2009,  23:32 Найти цитируемый пост)
В качестве примера создайте файл в кодировке UTF-8 без BOM (например, с помощью Notepad++) со сл. программой:
Код

<?php
// Файл в кодировке UTF-8 без BOM !!!
header("Content-Type: text/html; charset=iso-8859-1");
$text_UTF = "öäüßzeile1";
echo iconv("UTF-8", "ISO-8859-1//IGNORE", $text_UTF);
?>

В результате получим нормальный результат:


Ипатьев, у меня вот в этом примере (см. выше) не получается нормальный результат. Правда я не понял что такое BOM и еще у меня
Код

header("Content-Type: text/html; charset=utf-8");

То есть сама страница в utf-8, а текст, который вводят на странице надо переделать в iso-8859-1...

Автор: unicross 6.10.2009, 19:41
Цитата(cardinal @  6.10.2009,  20:29 Найти цитируемый пост)
 Правда я не понял что такое BOM

http://ru.wikipedia.org/wiki/BOM#.D0.9F.D0.BE.D1.80.D1.8F.D0.B4.D0.BE.D0.BA_.D0.B1.D0.B0.D0.B9.D1.82.D0.BE.D0.B2 - это метка порядка байтов, служебные символы, которые не позволят установить заголовки ответа сервера с помощью функции header(). Блокнот по умолчанию вставляет эти символы.

Цитата(cardinal @  6.10.2009,  20:29 Найти цитируемый пост)
То есть сама страница в utf-8, а текст, который вводят на странице надо переделать в iso-8859-1...

Нужно выбирать что-то одно или  iso-8859-1 или utf-8. Нельзя вывести две кодировки на одну страницу без искажения одной из кодировок.

Этот пример абсолютно рабочий... Сама страница в utf-8, а текст, который вводят на странице переделывается в iso-8859-1 и посылается соответствующий заголовок (iso-8859-1, а не utf-8)...

Цитата
и еще у меня

Вот из-за этого и ошибка...

Автор: Ипатьев 6.10.2009, 19:58
Странно.
Зачем указывать одну кодировку, а текст перекодировать в другую. 

Если надо переделать текст, который вводят, то при чем здесь вывод?

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

Автор: cardinal 6.10.2009, 21:22
Цитата(unicross @  6.10.2009,  17:41 Найти цитируемый пост)
Нужно выбирать что-то одно или  iso-8859-1 или utf-8. Нельзя вывести две кодировки на одну страницу без искажения одной из кодировок.

То что будет искажение это понятно.
Цитата(unicross @  6.10.2009,  17:41 Найти цитируемый пост)
Вот из-за этого и ошибка...

Цитата(Ипатьев @  6.10.2009,  17:58 Найти цитируемый пост)
Зачем указывать одну кодировку, а текст перекодировать в другую. 

Прочитал эти слова и решил пройтись по заголовкам всех страниц. И вот оно, не везде iso-8859-1 указал и поэтому данные с одной страницы на другую передавались не так. Вообщем всем спасибо! Проблема решилась (почти сама собой smile)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)