[英]Understanding character encoding in PHP
我正在努力理解PHP中的字符編碼。
考慮以下腳本(您可以在此處運行):
$string = "\xe2\x82\xac";
var_dump(mb_internal_encoding());
var_dump($string);
var_dump(unpack('C*', $string));
$utf8string = mb_convert_encoding($string, "UTF-8");
var_dump($utf8string);
var_dump(unpack('C*', $utf8string));
mb_internal_encoding("UTF-8");
var_dump($string);
var_dump($utf8string);
我有一個字符串,實際上是€字符,用unicode代碼點表示。 高達PHP 5.5
,使用的內部編碼是ISO-8859-1
,因此我認為我的字符串將使用此編碼進行編碼。 使用unpack
我可以看到我的字符串的咬合表示,它對應於我用來定義字符串的十六進制代碼。
然后我使用mb_convert_encoding
將字符串的編碼轉換為UTF-8
。 此時,字符串在屏幕上的顯示方式不同,其字節表示也會發生變化(這是預期的)。
如果我將PHP
內部編碼也改為UTF-8
,我希望在屏幕上正確顯示utf8string
,但這不會發生。
我錯過了什么?
您顯示的腳本不使用任何非ascii字符,因此其內部編碼沒有任何區別。 mb_internal_encoding
確實會在輸出中轉換您的數據。 這個問題會告訴你更多它是如何工作的; 它也會告訴你最好不要使用它。
代碼中的三字節字符串$string
是歐元符號的UTF-8表示形式,而不是其“unicode代碼點”(寬度為2字節,與所有常見的Unicode字符一樣: 0x20ac
)。
這會清除你看到的行為嗎?
您從一個字符串開始,該字符串是歐元符號的utf-8
表示。 如果你運行echo($string)
所有版本的PHP都會產生你放在$string
的三個字節。 瀏覽器如何解釋它們取決於Content-Type
標頭中指定的字符集。 如果是text/html; charset=utf-8
text/html; charset=utf-8
然后你在渲染頁面中得到歐元符號。
然后你做錯了。 你只用兩個參數調用mb_convert_encoding()
。 這允許PHP使用mb_string
擴展使用的內部編碼的當前值作為第三個參數( $from_encoding
)。 為什么?
對於PHP 5.6及更高版本, mb_internal_encoding()
返回的默認值為utf-8
,對mb_convert_encoding()
的調用為no-op。
但是對於以前版本的PHP, mb_internal_encoding()
返回的默認值是iso-8859-1
,它與字符串的編碼不匹配。 因此, mb_convert_encoding()
將$string
的字節解釋為三個單獨的字符,並使用utf-8
的規則對它們進行編碼。 結果顯然是錯誤的。
順便說一下,如果用'€'
初始化$string
,你會在所有PHP版本上獲得相同的輸出(即使在PHP 4,iirc上)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.