將我的網站轉換爲使用utf-8後,我現在面臨驗證所有傳入的utf數據的前景,以確保其有效和一致。如何驗證PHP中的utf序列?
似乎有各種正則表達式和PHP API來檢測字符串是否是utf,但我看到的那些似乎不完整(正則表達式驗證utf,但仍允許無效的第三個字節等)。
我也關心檢測(和防止)超長編碼,這意味着可以編碼爲多字節utf序列的ASCII字符。
歡迎任何建議或鏈接!
將我的網站轉換爲使用utf-8後,我現在面臨驗證所有傳入的utf數據的前景,以確保其有效和一致。如何驗證PHP中的utf序列?
似乎有各種正則表達式和PHP API來檢測字符串是否是utf,但我看到的那些似乎不完整(正則表達式驗證utf,但仍允許無效的第三個字節等)。
我也關心檢測(和防止)超長編碼,這意味着可以編碼爲多字節utf序列的ASCII字符。
歡迎任何建議或鏈接!
mb_check_encoding()被設計用於此目的:
mb_check_encoding($string, 'UTF-8');
你可以用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");
}
在UTF-8中使用代理對對ASCII字符進行編碼似乎是非法的。試圖用'(chr(0b11000001)+ chr(0b10000001))解碼代理對'a'。decode('utf-8')'使得Python抱怨。 – millimoose
@Kerrek,好的謝謝你的指針。我仍然找到我的方式周圍的計算器。 – carpii