簡體   English   中英

理解PHP中的字符編碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM