PHP URLDecode / UTF8_Encode Набор символов Проблемы со специальными символами - PullRequest
3 голосов
/ 05 апреля 2011

Я передаю символ фунта £ на страницу PHP, которая была URLE-кодирована ASP как %C2%A3.

Проблема:

urldecode("%C2%A3") // £
ord(urldecode("%C2%A3")) // get the character number - 194
ord("£") // 163  - somethings gone wrong, they should match

Это означает, что когда я делаю utf8_encode(urldecode("%C2%A3")), я получаю £

Однако, делая utf8_encode("£") Я получаю £, как и ожидалось

Как я могу решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 05 апреля 2011

Я не думаю, что ord() совместимо с несколькими байтами.Вероятно, он возвращает только код для первого символа в строке, который является Â.Попробуйте utf8_decode() строку перед вызовом ord() и посмотрите, поможет ли это.

ord(utf8_decode(urldecode("%C2%A3"))); // This returns 163
3 голосов
/ 05 апреля 2011

если вы попробуете

var_dump(urldecode("%C2%A3"));

вы увидите

string(2) "£"

, потому что это 2-байтовый символ и ord () возвращает значение первого (194 = Â)

2 голосов
/ 05 апреля 2011

Некоторые сведения о urldecode и UTF-8 можно найти в первом комментарии документации urldecode . Кажется, это известная проблема.

0 голосов
/ 05 апреля 2011

Первый комментарий на php.net для urlencode () объясняет , почему это так, и предлагает этот код для его исправления:

<?php
function to_utf8( $string ) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
    if ( preg_match('%^(?:
      [\x09\x0A\x0D\x20-\x7E]            # ASCII
    | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF]         # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF]         # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2}      # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2}      # plane 16
)*$%xs', $string) ) {
        return $string;
    } else {
        return iconv( 'CP1252', 'UTF-8', $string);
    }
}
?> 

Также вам следуетрешите, хотите ли вы, чтобы ваш окончательный HTML, который вы отправляете в браузер, был в формате utf-8 или в какой-либо другой кодировке, в противном случае в вашем коде по-прежнему будут присутствовать символы £.

...