2014-03-28 11 views
1

我的PHP形式提交特殊拉丁字符作爲符號。表,無需特別的拉丁字符作爲符號

所以,魁北克變成QUA©BEC

我的形式設置爲UTF-8和我的數據庫表有latin1_swedish_ci整理。

PHP:$db = new PDO('mysql:host=localhost;dbname=x;charset=utf8', 'x', 'x');

一個bindParam:$sql->bindParam(":x", $_POST['x'],PDO::PARAM_STR);

我是新來的PDO所以我不知道是什麼問題。謝謝

*我使用phpMyAdmin

+0

你就不能在UTF-8的一切嗎?你有一個要求,你的數據庫需要一個latin1字符集?在一個應用程序中處理多個字符集當然是可能的,但需要詳細的計劃和關注。在將字符串存儲到數據庫中之前,將該字符串轉換爲latin1,並在打印之前將其轉換爲輸出字符集(可能是utf-8)。 – Carsten

+0

我將我的數據庫表格列更改爲UTF8,並將php頭文件和meta設置爲UTF8。同樣的結果。你會如何建議將所有更改爲UTF8? – DDDD

回答

0

你幾乎回答了你自己的問題:您收到UTF- 8,但試圖將其存儲在拉丁文-1列中。您可以更改MySQL中列的編碼,也可以使用iconv函數在兩種編碼之間進行轉換。

+0

我將列更改爲utf8_unicode_ci,問題依然存在。 – DDDD

+0

有沒有辦法將PDO更改爲latin1? – DDDD

+0

這可能會幫助你:http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names –

0

更改數據庫表和列utf8_unicode_ci。

+0

我將列更改爲utf8_unicode_ci,問題依然存在。 – DDDD

0

請確保您有UTF-8編碼保存文件(這往往被忽視)

套頭:

<?php header("Content-type: text/html; charset=utf-8"); ?> 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+0

這應該是在form.php或動作PHP文件? – DDDD

+0

in form.php文件 –

+0

我添加了標題和元。將數據庫表格列更改爲UTF8並仍然相同。 – DDDD

1

要展開一個多一點的編碼問題...

你看到在源一個字符變爲兩個(或多個字符)的任何時間,你應該馬上懷疑是編碼的問題,特別是如果UTF -8涉及。這是爲什麼。 (我很抱歉,如果你已經知道了一些,但我希望能幫助一些未來SO'ers爲好。)

所有字符都存儲在您的電腦沒有字符,但以字節爲單位。早在過去,空間和傳輸時間比現在更爲有限,所以人們試圖保存每個可能的字節,甚至不使用全字節來存儲字符。現在,因爲我們意識到我們需要與整個世界進行交流,所以我們認爲能夠用每種語言表達每個角色更爲重要。這種轉變並不總是順利,這就是你所面臨的挑戰。

的Latin-1(在各種口味)是始終使用單一的8位字節爲一個字符的編碼。這意味着它只能有256個可能的字符。很多,如果你只想寫英文或瑞典文,但不足以添加俄文和中文。 (background on Latin-1)

UTF-8以完全相同的方式對Latin-1的前半部分進行編碼,這就是爲什麼你看到大部分字符看起來都一樣。但它並不總是使用一個字符作爲一個字符 - 它最多可以在一個字符上使用四個字節。 (utf-8)正如您發現的那樣,它使用2個字節作爲é。但Latin-1不知道這一點,並正在盡力顯示這兩個字節。

關鍵是要始終指定您的字節流編碼(如從文件,URL或數據庫信息),並確保編碼是正確的。 (當然,這確實很難找到。)大多數現代語言,比如Java和PHP,在處理不同編碼之間的所有翻譯問題方面做得很好,只要你正確地指定了你正在處理的內容。