2011-04-05 135 views
3

我將一個英鎊符號£傳遞給一個已被URLEncoded編碼爲%C2%A3的PHP頁面。PHP URLDecode/UTF8_Encode字符集特殊字符集問題

問題:

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("£")我得到£預期

我該如何解決這個問題?

回答

3

的價值我不認爲ord()是多字節兼容的。它可能只返回字符串中第一個字符的代碼,即Â。嘗試utf8_decode()字符串,然後致電ord()並查看是否有幫助。

ord(utf8_decode(urldecode("%C2%A3"))); // This returns 163 
+0

謝謝,這個排序我的問題,繞$ _POST [「myvar」]包裹utf8_decode(),它的所有工作如預期 – Marcus 2011-04-05 10:32:26

3

如果您嘗試

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

你會看到

string(2) "£" 

,因爲這是2字節字符和ord()返回第一個(194 = A)

+0

爲什麼ord(「£」)返回163?我的代碼的其餘部分工作正常,如果我硬編碼「英鎊」,所以我正在尋找PHP認識到這一點字符163 – Marcus 2011-04-05 10:29:27

+0

因爲你自己鍵入它。 – Arkh 2011-04-05 10:30:45

+0

@Arkh那沒什麼幫助,因爲我試圖讓PHP識別POSTED變量「£」作爲字符163. – Marcus 2011-04-05 10:33:16

1

關於urldecode和UTF-8的一些資訊可以在the first comment of the urldecode documentation找到。這似乎是一個已知的問題。

+0

很棒!這似乎描述了這個問題。 – Marcus 2011-04-05 10:34:11

+0

這不是一個問題,也不是PHP中的錯誤。評論指的是由於缺少UTF8元標記/標題而可能發生的錯誤客戶端編碼。如果您嘗試修復這樣的錯誤請求,您會得到意想不到的結果。 – Phil 2016-09-05 15:54:00

-1

上php.net的first comment的urlencode()來explains這是爲什麼,並建議該代碼更正它:

<?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或其他編碼中,否則您將繼續在您的代碼中出現英文字母。

+0

正在將數據傳遞給內置類的PHP,該類需要UTF-8編碼。你看到任何理由使用該函數,而不是utf8_decode()? – Marcus 2011-04-05 10:45:06

+0

因爲%C2%A3不是utf-8 - utf-8-pund會是%20%A4。你從ASP-Code獲得的是iso-8859-1字符。 這個函數檢查一個字符串是否是有效的utf-8,如果沒有,它將它轉換爲utf8。還使用utf8_decode()給你iso-8859-1字符而不是utf-8字符。 – Dexter 2011-04-05 12:59:46

+0

這個函數只是猜測編碼,如果沒有找到任何utf8字符,就執行一個utf8_encode。如果你在源頭解決問題,你永遠不需要這樣的事情。 – Phil 2016-09-05 15:48:46