2012-05-06 21 views
1

我正在向第三方網站發送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") == í; 
+0

你確定這個文本還不是utf-8嗎?編碼運行後獲得一個'Ã'會表明您現在對文本進行雙重編碼。 –

+0

@Marc B我不確定,因爲它是第三方網站,我從中獲取cURL響應,但是在網站上的html頁面明確指定了UTF-8,所以我期望文本文件也是如此。我在嘗試使用utf_encode來響應原始的str_replace不起作用,並且我也沒有更加明確地解釋爲什麼會這樣。 – wheresrhys

+0

,當然,你確定你正在輸出到utf-8環境嗎?將utf-8文本轉儲到iso8859頁面將產生相同的效果。 –

回答

1

函數utf8_encode絕對不走這裏的路(你是雙重編碼,如果你這樣做)。

Re。直接搜索字符或使用十六進制代碼搜索字符,你是否確定在正則表達式的末尾添加了u修飾符?例如/\x00\xED/u

+0

我不確定在正則表達式中utf8的語法是什麼,所以非常感謝...但它甚至沒有與str_replace一起工作(使用這裏的建議http://stackoverflow.com/questions/3959626/replace- unicode-character) – wheresrhys

+0

那麼,你可以試試preg_replace嗎? 至於str_replace - 也許你保存這段代碼的文件需要保存在一個特定的編碼或某個標記中(就像你在鏈接的答案中一樣)。 – Ansari

1

您可能指定了您想要通過PHP源代碼中的字符串文字替換的字符/字符串?如果你這樣做,那麼這些字符串的值取決於你保存你的php文件的編碼。所以,當你看到字符í時,也許字面值是一個拉丁編碼í,也許可能是8859-1編碼,或者可能是它的Windows cp1252í,或者也許它的utf8í,或者甚至utf32í...我不知道有多少這些是不同的,但我知道至少有一些有不同的字節表示,所以不會在PHP字符串比較匹配。

我的觀點是,你需要指定正確的字符將匹配任何編碼傳入的文本是英寸

下面有一個例子,而無需使用文字

$iso8859_1 = chr(236); 
$utf8 = utf8_encode(chr(236)); 

予以警告,文本編輯器可能會或如果您決定將文件編碼更改爲utf8,則在更改編碼時可能不會轉換現有字符。我已經看到編輯在更改編碼時做了很奇怪的事情。從一個新的文件開始。

也只是因爲其他服務器聲稱它的utf8,並不意味着它是真的。

+0

我會在稍後測試它,因爲它看起來是一個很好的答案。然而,我確實發現我過分複雜化了這個問題。一個更好的解決方案是'utf8_encode'字符串,然後當包含字符串的數組上調用'json_encode'時,它不會再破壞,並且可以成功傳遞給我的js應用程序 - 無需做任何替換。 – wheresrhys