Преобразование windows-1255 в UTF-8 в PHP 5

У меня есть страница на моем веб-сайте, которая получает основной контент со старого мейнфрейма. Кодировка содержимого мэйнфрейма — windows-1255 (иврит). Кодировка моего сайта - UTF-8.

Сначала я использовал iframe для отображения полученного ответа от мейнфрейма. В этом решении у меня не было проблем с настройкой кодировки страницы, и отображение символов было в порядке, но у меня были некоторые проблемы с адаптивным стилем страницы (все мои веб-сайты адаптивны).

Затем я попытался получить содержимое с помощью file_get_contents и добавить его в нужное место, но все символы выглядят так: ������ ��, затем я преобразовал содержимое:

iconv("cp1255","UTF-8",file_get_contents("my_url"));

Результатом этого стал обратный иврит. Например, слово «хороший» появляется как «эцин». Контент также включает теги HTML, а не только текст на иврите, поэтому я не могу просто перевернуть текст с помощью hebrev.

Я видел, что в PHP 4 существует функция fribidi_log2vis, которая кажется для решения моей проблемы, но он не поддерживается в PHP 5 (я работаю с PHP 5.3.3).

Есть ли способ справиться с этим лучше, чем загрузка контента в iframe?

ОБНОВЛЕНИЕ

Я попытался получить тестовый файл, который я создал (с кодировкой windows-1255), и мой исходный код работает нормально. Я подозреваю, что контент, который я получаю, не является Windows-1255, по крайней мере, не с точки зрения порядка букв иврита. Причиной может быть преобразование на мейнфрейме. Я должен разобраться с этим (мне нужно подождать до воскресенья, потому что у меня нет прямого доступа к серверу).


person Itay Gal    schedule 03.01.2014    source источник
comment
Пробовали ли вы mb_convert_encoding?   -  person Machavity♦    schedule 03.01.2014
comment
@Machavity mb_convert_encoding также приводит к перевернутому тексту.   -  person Itay Gal    schedule 03.01.2014
comment
Я ничего не знаю о иврите, но, похоже, вы довольно успешно перешли на UTF-8; возможно, вам просто нужно настроить HTML-разметку, чтобы сообщить браузеру, что такой текст должен отображаться как RTL.   -  person Álvaro González    schedule 03.01.2014
comment
@ ÁlvaroG.Vicario Я установил для страницы RTL. Остальной текст UTF-8 на иврите, как и текст моего меню, отображается нормально, но преобразованный текст переворачивается.   -  person Itay Gal    schedule 03.01.2014
comment
Кстати, fribidi_log2vis() поддерживается в PHP 5, просто он больше не связан с PHP. См. страницу PECL для получения дополнительной информации и даже для загрузки Windows.   -  person Álvaro González    schedule 03.01.2014
comment
Во-первых, вы можете схитрить и поменять местами подстроки на иврите только в результирующей строке с некоторым preg_replace_callback. Во-вторых, создается впечатление, что содержимое, поступающее с мэйнфрейма, не является cp1255 или содержит некоторые символы bidi, которые управляют направлением текста. В любом случае, отсюда трудно сказать, но если бы вы могли загрузить пример содержимого файла, мы могли бы помочь в дальнейшем.   -  person Alex    schedule 03.01.2014
comment
Попробуйте это: stackoverflow.com/questions/20600843/   -  person    schedule 12.05.2014


Ответы (1)


Проблема в том, что file_get_contents получает содержимое с кодировкой ISO 8859-1. Необходимо создать контекст потока функцией stream_context_create с кодировкой Windows-1255 для file_get_contents:

$opts = array('http' => array('header' => 'Accept-Charset: windows-1255,utf-8;q=0.7,*;q=0.7'));
$context = stream_context_create($opts);

$content = file_get_contents('my_url', false, $context);
iconv("cp1255", "UTF-8", $content);
person Dmitriy.Net    schedule 03.01.2014
comment
Я не знаю, в этом ли проблема, но предложенное вами решение не работает. - person Itay Gal; 03.01.2014
comment
какой вывод после iconv? - person Dmitriy.Net; 03.01.2014
comment
Все тот же результат. - person Itay Gal; 03.01.2014
comment
Можете дать адрес, где вы берете контент? - person Dmitriy.Net; 03.01.2014
comment
Я знаю это как в старом сообщении, но я получил свой ответ, но не из этого сообщения, а из этого: stackoverflow.com/questions/15593394/ - person bestprogrammerintheworld; 08.06.2021