Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение кодировки при помощи iconv, написал тестик, а он не работает 
V
    Опции темы
cardinal
Дата 5.10.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Код

$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. То есть вторая строка не выдается вообще (вторая функция ничего не возвращает). Не понимаю почему...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
unicross
Дата 5.10.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



Цитата(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
PM MAIL WWW   Вверх
cardinal
Дата 6.10.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



unicross, спасибо. При помощи //IGNORE получил
öäüßzeile1zeile2

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

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

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


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
unicross
Дата 6.10.2009, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



Цитата(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-эквиваленты с помощью функции htmlentities()
Код

<?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-эквиваленты.

Это сообщение отредактировал(а) unicross - 6.10.2009, 01:56
PM MAIL WWW   Вверх
cardinal
Дата 6.10.2009, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Но ведь умлауты есть в ISO_8859-1?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
unicross
Дата 6.10.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



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

cardinal, если вы под словом "умлаут" подразмеваете буквы ä, ö и ü, то эти символы присутствуют в кодировке ISO_8859-1 и нормально преобразовываются в (из) UTF-8 с помощью iconv() (примеры в моем посте выше, там с этими буквами все нормально).
PM MAIL WWW   Вверх
Ипатьев
Дата 6.10.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



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

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

Это сообщение отредактировал(а) Ипатьев - 6.10.2009, 14:19
PM MAIL   Вверх
cardinal
Дата 6.10.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(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...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
unicross
Дата 6.10.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 21
Всего: 53



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

BOM - это метка порядка байтов, служебные символы, которые не позволят установить заголовки ответа сервера с помощью функции 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)...

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

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

Это сообщение отредактировал(а) unicross - 6.10.2009, 19:56
PM MAIL WWW   Вверх
Ипатьев
Дата 6.10.2009, 19:58 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



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

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

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

PM MAIL   Вверх
cardinal
Дата 6.10.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(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)...

Это сообщение отредактировал(а) cardinal - 6.10.2009, 23:19


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0932 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.