2015-02-11 87 views
0

According to the PHP website它這樣做:mb_internal_encoding()實際上是什麼意思?

encoding是用於HTTP輸入 字符編碼轉換的字符編碼名稱,HTTP輸出字符編碼 轉換,以及用於字符串函數 默認的字符編碼由定義的mbstring模塊。你應該注意到內部的 編碼和多字節正則表達式完全不同。

但我認爲這種解釋還不足以讓我明白。

一旦我用PHP中的CURL請求了一些API。我正在解析響應數據。響應標題包含Content-Length。所以我相信Content-Length顯示了正確的價值。另外,mb_strlen($responseData)的結果值與Content-Length的值相同。

如果我設置內部編碼值,如mb_internal_encoding('UTF-8')順便說一下,結果值mb_strlen($responseData)是不一樣的!其實,這個值比以前小。

我的Web服務器編碼,文件編碼和接受編碼都設置爲UTF-8。

爲什麼會出現這個問題?

+0

沒有問題。解碼文本的長度被返回。 – 2015-02-11 05:45:30

回答

1

PHP對待字符串作爲字節數組,就像啞巴字節的集合。它不知道編碼或「字符」。 mb_ *函數是一組可識別編碼的工具,可以逐個字符地處理字符串。例如,UTF-8中的字符串「漢字」是6個字節長,但只代表兩個字符。爲了能夠逐個字符地處理字符串,mb_ *函數需要知道給定字符串的編碼。每個mb_ *接受參數$encoding,因此您可以告訴它。例如: -

mb_strlen('漢字', 'UTF-8') // 2 

要設置這個編碼在全球一勞永逸,並沒有將它傳遞到每一個功能,有mb_internal_encoding。它只是記住編碼設置,以及想要從中獲取該設置的每個功能。手冊詳細介紹了哪些功能可以使用它。

您的特定「問題」是HTTP內容長度標頭指定以字節爲單位的內容長度。該值是編碼不可知的,實際上它的唯一目的是提醒客戶端的字節數將隨後的有效負載。這個有效載荷可以是任何東西,所以大小以字節爲單位給出。如果您將它解釋爲給定編碼中的字符,結果將會不同。請參閱What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text

1

內容長度是字節中的響應大小。在ASCII中,Content-Length ==字符數。在UTF-8中,單個字符可以由多個字節組成,因此字符數將等於或小於Content-Length。

例如:

A在ASCII = 0x41(一個字節)

在UTF-8 = 0x20A0(兩個字節)

mb_strlen返回(字符數不的數目字節)給定的編碼類型。

strlen("€") 
>> 2 
mb_strlen("€", 'UTF-8') 
>> 1 
strlen("A") 
>> 1 
mb_strlen("A", 'UTF-8') 
>> 1