我正在爲國際客戶工作,他們擁有所有非常不同的字母,因此我試圖最終獲得PHP和MySQL之間的完整工作流程概述,以確保所有字符編碼能夠正確插入。我已經閱讀了一些關於這方面的教程,但仍然有問題(有很多需要學習的內容),並且認爲我可能會將它們放在一起並詢問。UTF8工作流程PHP,MySQL彙總
PHP
header('Content-Type:text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');
HTML
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<form accept-charset="UTF-8"> .. </form>
(雖然後來是可選的,而是一個建議,但我相信我寧願建議不會做任何事情)
MySQL
CREATE database_name DEFAULT CHARACTER SET utf8;
或ALTER database_name DEFAULT CHARACTER SET utf8;
和/或使用utf8_general_ci
作爲MySQL連接歸類。
(這是important to note這裏,這將增加數據庫的大小,如果它使用VARCHAR)
連接
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");
業務邏輯
檢測如果不是UTF8與mb_detect_encoding()
並用ivon()
轉換。
驗證UTF8和UTF16的超長序列
$body=preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]|(?<=^|[\x00-\x7F])[\x80-\xBF]+|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/','�',$body);
$body=preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $body);
問題
是必要的,PHP 5.3和更高
mb_internal_encoding('UTF-8')
如果是的話這是否意味着我必須使用所有的多字節函數來代替其核心功能如mb_substr()
而不是substr()
?是否仍然需要檢查格式錯誤的輸入刺激,如果是的話,那麼可靠的函數/類是如何執行的?我可能不想去掉不好的數據,也不太瞭解音譯。
它應該是
utf8_general_ci
還是utf8_bin
?在上述工作流程中是否有缺失?
來源:
http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/
http://webcollab.sourceforge.net/unicode.html
http://stackoverflow.com/a/3742879/1043231
http://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/
http://akrabat.com/php/utf8-php-and-mysql/
好了,問題是什麼? –
對不起,我用,因爲它似乎計算器錯誤我的一些源鏈接的代碼和拋出一個錯誤張貼這個問題掙扎....現在的工作... – Dominik
mb_internal_encoding需要(「UTF-8」),如果mb_internal_encoding()結果不是UTF-8。 – 2012-06-13 12:05:04