當客戶端發送 Get 資料時,utf-8 字元編碼在 urlencode 中有一個小問題。
考慮 "º" 字元。
有些客戶端可以發送(例如)
foo.php?myvar=%BA
而其他客戶端發送
foo.php?myvar=%C2%BA(「正確的」URL 編碼)
在這種情況下,您將值賦給變數 $x
<?php
$x = $_GET['myvar'];
?>
$x 儲存:在第一種情況下是 "�"(錯誤),在第二種情況下是 "º"(正確)
要解決這個問題,您可以使用這個函式
<?php
函式 to_utf8( $string ) {
// 來自 http://w3.org/International/questions/qa-forms-utf-8.html
如果 ( preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # 非過長 2 位元組
| \xE0[\xA0-\xBF][\x80-\xBF] # 排除過長
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # 直接 3 位元組
| \xED[\x80-\x9F][\x80-\xBF] # 排除代理對
| \xF0[\x90-\xBF][\x80-\xBF]{2} # 平面 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # 平面 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # 平面 16
)*$%xs', $string) ) {
返回 $string;
} 否則 {
返回 iconv( 'CP1252', 'UTF-8', $string);
}
}
?>
並以這種方式賦值
<?php
$x = to_utf8( $_GET['myvar'] );
?>
$x 儲存:第一種情況 "º" (良好) 和第二種情況 "º" (良好)
解決了很多 i18n 問題。
請在下一版的 PHP 中修正 $_GET 變數的自動 URL 解碼。
再見。
Alejandro Salamanca