2016-02-26 101 views
1

我接收$ _GET參數作爲十六進制表示形式的"6d617263f2"字符串。PHP - 字符串編碼

據我瞭解字符編碼,這不是一個UTF-8字符串。如果我用UTF-8編碼打印它,我得到的是"marc�"。如果我使用utf8_encode將字符串轉換爲UTF-8,我會得到正確的表示形式,即marcò

我在php.ini文件中設置了所有字符編碼(default_carset,iconv和mbstring)以使用UTF-8。我也有mbstring.encoding_translation設置爲On

我無法完全理解正在發生什麼...爲什麼我沒有使用UTF-8正確編碼$_GET參數?

我的猜測是:

  • 客戶端使用其它字符編碼,如果我想使用UTF-8,也就是明確地我的參數轉換爲UTF-8

  • 沒有其他辦法

    我在某處丟失了某些東西...

請問你能幫我解釋一下嗎?

+0

您是否在控制發送該GET參數,還是從不可控的第三方接收它? – deceze

+0

@deceze無法控制的第三方 – marcosh

回答

2

如果您不控制該GET參數的來源,那麼您就無能爲力。 PHP會給你這個字符串,不會自動轉換它的編碼。它不能,因爲它不知道什麼編碼從轉換。沒有任何規範或任何人可以從中獲取信息。 需要指定接受字符串的編碼。不要讓它由客戶決定,因爲那樣你就不知道你會得到什麼。

如果客戶端向您發送ISO-8859編碼文本,但您希望它在內部進行UTF-8編碼(一個明智的選擇),您只需轉換其編碼。我會使用iconv('ISO-8859-1', 'UTF-8', $_GET['foo']),因爲它更明確,但utf8_encode碰巧完全一樣。