我正在向第三方網站發送cURL請求,該網站返回一個文本文件,我需要在其上執行一些字符串替換,以便用它們的html實體替換某些字符,例如我需要將í
替換爲í
。將cURL響應編碼爲UTF-8時出現奇怪的行爲
的響應使用string_replace/preg_replace_callback
直接並未導致在比賽中(無論是搜索í
直接或通過其十六進制代碼\x00\xED
),所以我進行替換之前使用utf8_encode()
。但utf8_encode
將Ã
替換爲所有í
個字符。
爲什麼會發生這種情況,以及使用php在任意文本塊上執行UTF-8替換的正確方法是什麼?
*編輯 - 一些進一步的研究表明
utf8_decode("í") == í;
utf8_encode("í") == ÃÂ;
utf8_encode("\xc3\xad") == ÃÂ;
你確定這個文本還不是utf-8嗎?編碼運行後獲得一個'Ã'會表明您現在對文本進行雙重編碼。 –
@Marc B我不確定,因爲它是第三方網站,我從中獲取cURL響應,但是在網站上的html頁面明確指定了UTF-8,所以我期望文本文件也是如此。我在嘗試使用utf_encode來響應原始的str_replace不起作用,並且我也沒有更加明確地解釋爲什麼會這樣。 – wheresrhys
,當然,你確定你正在輸出到utf-8環境嗎?將utf-8文本轉儲到iso8859頁面將產生相同的效果。 –