2011-10-23 41 views
1

將我的網站轉換爲使用utf-8後,我現在面臨驗證所有傳入的utf數據的前景,以確保其有效和一致。如何驗證PHP中的utf序列?

似乎有各種正則表達式和PHP API來檢測字符串是否是utf,但我看到的那些似乎不完整(正則表達式驗證utf,但仍允許無效的第三個字節等)。

我也關心檢測(和防止)超長編碼,這意味着可以編碼爲多字節utf序列的ASCII字符。

歡迎任何建議或鏈接!

+0

在UTF-8中使用代理對對ASCII字符進行編碼似乎是非法的。試圖用'(chr(0b11000001)+ chr(0b10000001))解碼代理對'a'。decode('utf-8')'使得Python抱怨。 – millimoose

+0

@Kerrek,好的謝謝你的指針。我仍然找到我的方式周圍的計算器。 – carpii

回答

6

mb_check_encoding()被設計用於此目的:

mb_check_encoding($string, 'UTF-8'); 
+0

+1,這是更好的解決方案。在開始修改'iconv'之前,應該先研究一下。 – Jon

+0

取決於PHP版本(查看答案中的鏈接)。 –

+0

如果需要,我前一段時間寫了一個純PHP版本,你可以在這裏找到(http://www.php.net/manual/en/function.utf8-encode.php#39986) ) – Benjamin

1

你可以用iconv做很多事情,它可以告訴你,如果序列是有效的UTF-8。

告訴它從UTF-8轉換爲相同的:

$str = "\xfe\x20"; // Invalid UTF-8 
$conv = @iconv('UTF-8', 'UTF-8', $str); 
if ($str != $conv) { 
    print("Input was not a valid UTF-8 sequence.\n"); 
} 

詢問的字符串的字節長度:

$str = "\xfe\x20"; // Invalid UTF-8 
if (@iconv_strlen($str, 'UTF-8') === false) { 
    print("Input was not a valid UTF-8 sequence.\n"); 
} 
+0

爲什麼錯誤抑制('@')? –

+0

@JaredFarrish:因爲它在遇到無效序列時發出通知。 – Jon

+0

哦,恐怖!合法使用'@'抑制器?我一定是在做夢。 ';)' –