2012-04-02 68 views
1

我需要使用正則表達式在我的php腳本中處理字符串。但是有一個問題 - 不同的字符串有不同的編碼。如果字符串只包含ascii符號,mb_detect_encoding函數返回'ASCII'。但是,如果字符串包含俄語符號,例如,mb_detect_encoding返回'UTF-8'。我想,手動檢查每個字符串的編碼並不是個好主意。 所以問題是 - 對於ascii字符串使用preg_replace(使用unicode修飾符)是否正確?爲ascii和utf-8字符串編寫這樣的代碼preg_replace ("/[^_a-z]/u","",$string);是否正確?php preg_replace:用於ASCII字符串的unicode修飾符

回答

2

如果兩個選項是「UTF-8」或「ASCII」,這將是沒有問題的,但事實並非如此。

如果PHP不使用UTF-8,它使用ISO-8859-1,它不是ASCII(它是ASCII的超集,前127個字符,它是ASCII的超集,例如一些字符瑞典的å,äö,可以用ISO-8859-1和Unicode代表,用不同的代碼點表示!我認爲這對於preg_ *函數來說不太重要,所以它可能不適用於你的問題,但在使用不同的編碼時請記住這一點

你應該真的試着知道你的字符串在哪個字符集中,沒有mb_detect_encoding的魔力(mb_detect_encoding不是保證,只是一個很好的猜測)。例如,通過HTTP doe獲取的字符串s在HTTP標頭中指定了一個字符集。

+0

>通過HTTP獲取的字符串確實在HTTP標頭中指定了一個字符集。 我發送'無論如何,如果我爲$ _POST變量使用mb_detect_encoding,它將返回'ascii'。這是否意味着猜測是錯誤的,字符串是utf-8編碼? – user1235446 2012-04-02 14:59:38

+0

不,如果它表示ASCII,它很可能是ASCII,這意味着所有字符的代碼點都小於128(幾乎每個編碼都共享這些代碼點以實現向後兼容)。這意味着ASCII檢測應該完全正確,但其他編碼可能不會。但請注意,還有其他編碼,並且如果不是UTF-8,則PHP中的標準是ISO-8859-1(ASCII定義字符128-255的超集)。如果沒有指定編碼,ISO-8859-1也是網絡上的標準。 – 2012-04-02 15:02:13

+0

對不起,我還是不明白。發送上面提到的頭文件是否意味着我的服務器接收到所有用戶數據編碼的utf-8? user1235446 2012-04-02 15:15:48

0

是的,你總是可以使用Unicode修飾符,它不會影響結果和性能。

+0

Preg_replace會自動將所有ascii參數轉換爲unicode? – user1235446 2012-04-02 14:46:28

+0

UTF-8中的ASCII字符(代碼點0-127)是相同的,因此不需要轉換。 – 2012-04-03 07:17:04

+0

現在我不喜歡。我認爲比較不是通過字符的代碼點,而是通過ascii字符串中的每個字節以及utf-8中的每個2個字節進行比較。 – user1235446 2012-04-03 08:36:19

0

7位ASCII字符集在UTF-8中編碼相同。如果你有一個ASCII字符串,你應該可以在其上使用PREG「u」修飾符。但是,如果您有「補充」的8位ASCII字符集(如ISO-8859-1,Windows-1252或HP-Roman8),則最左側位(值x80-xff)的字符不是在UTF-8中編碼相同,使用PREG「u」修飾符也不合適。