html_entity_decode UTF-8 и –

rusan

Новичок
html_entity_decode UTF-8 и –

Вот эту самую сущность как-то неправлиьно декодит эта функция... никто не в курсе, только ли эту сущность или там вообще много подобных и где-то грабли с ними описаны??
 

rusan

Новичок
Я же нвятно написил!!! Всё попробовано... ненадо быть умнее чем ты есть на самом деле. Вы сами попробовали на этом символе данную схему? вот именно что нет. Именно для этого символа она не работает.
 

SiMM

Новичок
> Я же нвятно написил!!!
В каком месте?

> Всё попробовано
Может тогда подскажешь, почему, когда пробую я - у меня всё работает именно так, как и должно?

> ненадо быть умнее чем ты есть на самом деле
В зеркало посмотри.

> Вы сами попробовали на этом символе данную схему?
Пробовал, и?

> Именно для этого символа она не работает.
Не неси чепухи.

PS: заранее предупреждаю, что гадалок на этом форуме - нет, и под фразой "я пробовал" иногда скрываются настолько чудовищные перлы, что никакой фантазии не хватит.
 

rusan

Новичок
>> Всё попробовано
>Может тогда подскажешь, почему, когда пробую я - у меня всё работает именно так, как и должно?
Наверное все же не так... Спрашивалось об одной конкретной сущности. Только о – все остальные без проблем конвертятся самой простой функцией.

>> Вы сами попробовали на этом символе данную схему?
>Пробовал, и?
Покажите пожалуйста как вы пробовали, ниже я привёл код как я пользовал.

>> Именно для этого символа она не работает.
>Не неси чепухи.
Проверьте. Не несу.

А вот собственно и код
PHP:
<?php
$string = "foo &#150; bar";

print "source string = ".$string."<br>\n";
print "html_entity_decode = ".html_entity_decode($string, ENT_NOQUOTES, "UTF-8")."<br>\n";
print "utf8RawUrlDecode = ".utf8RawUrlDecode($string)."<br>\n";
print "Unicode2Charset = ".Unicode2Charset($string, "UTF-8")."<br>\n";



function utf8RawUrlDecode ($source) {
    $decodedStr = '';
    $pos = 0;
    $len = strlen ($source);
    while ($pos < $len) {
        $charAt = substr ($source, $pos, 1);
        if ($charAt == '%') {
            $pos++;
            $charAt = substr ($source, $pos, 1);
            if ($charAt == 'u') {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr ($source, $pos, 4);
                $unicode = hexdec ($unicodeHexVal);
                $entity = "&#". $unicode . ';';
                $decodedStr .= utf8_Encode ($entity);
                $decodedStr .= chr($unicode-848);
                $pos += 4;
            }
            else {
                // we have an escaped ascii character
                $hexVal = substr ($source, $pos, 2);
                $decodedStr .= chr (hexdec ($hexVal));
                $pos += 2;
            }
        }
        else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }
    return $decodedStr;
}

function Unicode2Charset($str, $charset = 'Windows-1251') { // by SiMM, &#xHHHH; addition by John Profic
  return preg_replace(
    '~&#(?:x([\da-f]+)|(\d+));~ie',
    'iconv("UTF-16LE", $charset, pack("v", "$1" ? hexdec("$1") : "$2"))',
    $str
  );
}
?>
Первая функция (из тех, на что мне дали ссылку) так и сотавляет эту сущность как &amp;#150; а мне нужен сам символ - длинное тире(&#150;).
 

SiMM

Новичок
> Покажите пожалуйста как вы пробовали, ниже я привёл код как я пользовал.
PHP:
echo Unicode2Charset('&#150;','UTF-8');
 

rusan

Новичок
http://www.ntgs.ru/test.php
Ссылка на мой файл (тот что я привёл выше). Хостинг valuehost. То что я описывал показывал на локале. Покажите пожалуйста ваш файл целиком и результат работы файла. Ну работает для всех, кроме этой энтити!

Да я вижу как вы защищаете свою функцию... Но попробуйте её хотя бы на некоторых хостингах. Хотя думаю, что просто эта сущность уникальная.

Upd: Вот что еще нашёл... &amp;#8211; (тоже длинное тире) конвертится отлично любой функцией, а вот &amp;#150; никакой. Да можно сделать простую замену и не греть голову, но хочется знать есть ли еще такие сущности...

PS. Simm я понимаю вы уверены в своей функции, но проверьте её хотя бы на нескольких хостингах и я готов с вами спорить хоть на что, что найдётся такой хостинг (и не один, а очень много), на котором ваша функция не правильно будет работать с этой (&amp;#150) сущностью.
 

SiMM

Новичок
> http://www.ntgs.ru/test.php Ссылка на мой файл
Хрена се. И после этого Вы продолжаете утверждать, что функция - не работает? А можно поинтересоваться, какого хрена вы говорите браузеру о том, что контент в кодировке windows-1251, когда выдаёте его в UTF-8?

> Покажите пожалуйста ваш файл целиком
Смысла не вижу выкладывать простыни - этого должно быть достаточно:
PHP:
header('Content-Type: text/html; charset=UTF-8');
echo Unicode2Charset('&#150;','UTF-8');
> Но попробуйте её хотя бы на некоторых хостингах.
Мне что - делать нехрен? ;)

> я готов с вами спорить хоть на что, что найдётся такой хостинг (и не один, а очень много), на котором ваша функция не правильно будет работать с этой (&#150) сущностью.
Гы. Достаточно отключить iconv, чтобы она ВООБЩЕ не работала. Если же iconv включен - то что ж, дерзайте, найдите хотя бы один ;)
 

rusan

Новичок
Я выложил именно тот файл, что показывал. И я броузеру ничего не говорю. Сейчас я добавил как вывод загловка. Разницы никакой (тем более что есть такой броузер internet explorer, который позваляет менять кодировки).

Ума не приложу как он работает.

Ваше "Гы".. смишно, конечно же я подразумевал хостинг с работающим iconv. Если у вас есть доступ на любой проект хостящийся на valuehost попробуйте. И вы поймёте, что вы не правы.

http://www.ntgs.ru/test.txt - новая версия файла. Результат по тому же адресу.
 

SiMM

Новичок
http://phpfaq.ru/na_tanke#headers

GET http://www.ntgs.ru/test.php HTTP/1.0
...
HTTP/1.0 200 OK
Content-Type: text/html; charset=windows-1251

Разбирайтесь сами, почему вместо UTF-8 у вас windows-1251.

-~{}~ 14.09.06 15:53:

До кучи (ибо уже изрядно запарило):
Символ с кодом 150 (0x96) - это SPA (см. таблицу Latin-1), при переводе в UTF-8 байт 0x96 (1001.0110) превратится в пару 0xC2 0x96 (1100.0010 1001.0110). Вы всё ещё продолжите утверждать, что на некоторых хостингах это не так?
 

dub

Новичок
rusan
не ты просто жжеш, ссылку я давал потому что сам ВСЕ ПРОБОВАЛ.
а если ты
>нвятно написил!!!
невнятно что-то написил(как я понял), и в чем то не разобрался, то это не повод доставать своими претензиями и раздражать. А за то, что повесилил спасиба:
есть такой броузер internet explorer, который позваляет менять кодировки).
Ума не приложу как он работает.
бугага.
 
Сверху