2013-10-08 65 views
0

我在編碼某個文件時遇到了麻煩。在我的php程序中,我得到一個txt文件。使用foreach並從這個文件中獲取每一行並做一個表格,然後我嘗試將這些數據放到我的數據庫中,插入後我沒有在數據庫中存在波蘭語的字母。我的數據庫,表和所有字段都有一個utf8_unicode_ci,並且當我使用phpmyadmin插入時,所有字母都是正常的。我嘗試使用detect_encoding($ row),並檢測ASCII解碼。我如何將波蘭語信件插入我的數據庫?請幫忙。以UTF-8格式保存字符串時遇到問題

我的數據庫連接:

try{ 
    $dbh = new PDO('mysql:dbname=google;host=localhost;','root',''); 
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
    $dbh -> query ('SET NAMES utf8'); 
    $dbh -> query ('SET CHARACTER_SET utf8_unicode_ci');} 

我嘗試

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url)); 

$url = Encoding::toUTF8($url); 

和OFC的iconv 任何其他的想法?

在我插入一切正常,它的一個例子:

PDOStatement Object ([queryString] => insert into `site` values ("","meblegdańsk.pl","1")) 
+3

是您的文本文件保存在UTF8? – mavrosxristoforos

+0

該文件保存在什麼編碼中? – deceze

+2

還要注意,編碼檢測是非常不準確的,無論'mb_detect_encoding'告訴你沒有多大意義。 [每個程序員絕對,積極需要知道關於編碼和字符集與文本工作](http://kunststube.net/encoding/) – deceze

回答

0

我懷疑mb_detect_encoding()不工作,你的思考方式:

串mb_detect_encoding(字符串$ STR [1,混合$ encoding_list = mb_detect_order() [,布爾$嚴格=虛假] )

如果省略了第二個參數you're often choosing between two encodings

Array 
(
    [0] => ASCII 
    [1] => UTF-8 
) 

最後,您問的是波蘭文本是ASCII還是UTF-8,並將結果轉換爲UTF-8。問題在於:

  • ASCII是UTF-8的子集。從ASCII轉換爲UTF-8不會改變您的輸入數據。
  • ASCII不能編碼波蘭字符。

這很難說,爲什麼你獲得ASCII作爲輸出,無需樣本數據的PHP很可能默認爲ASCII,如果文本顯然不是UTF-8,但具有嚴格的編碼檢測標誌設置爲false可以」幫助。

我建議你重新考慮爲什麼你需要首先檢測編碼。如果應用程序不需要使用特定編碼的輸入文件,並且無法更改必要條件,我建議您編寫波蘭文本中的典型編碼列表,並用mb_detect_encoding()進行編碼。

BTW,設置連接編碼推薦的方式是charset參數在DSN:

$dbh = new PDO('mysql:dbname=google;host=localhost;charset=utf8','root',''); 
+0

感謝您的回答,我真的錯了如何detect_encoding工作 – Anamesh

+0

我的壞是與db有關,當我設置$ dbh = new PDO('mysql: dbname = google; host = localhost; charset = utf8','root','');所有的開始都很好,謝謝! – Anamesh

0

你的MySQL查詢是錯誤的。這是SET CHARACTER SET utf8_unicode_ci(注意空間,而不是SETCHARACTER之間的下劃線,這可能是你的問題的最可能的原因。

在一些奇怪的MySQL的配置,您可能常常需要設置其它字符編碼相關的東西(但你不這樣做不會與這些不必要的浪費時間):http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

通過這不會對自己的工作(的方式,除非你使用mb_detect_order在前):

$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url)); 

如果你想轉換拉丁文字符s到UTF-8,但讓他們獨立,如果他們已經是UTF-8,你應該做的:

$url = mb_convert_encoding($url, 'UTF-8',array ('UTF-8', 'ISO-8859-2')); 
// or 
mb_detect_order(array ('UTF-8', 'ISO-8859-2')); 
$url = mb_convert_encoding($url,'UTF-8',mb_detect_encoding($url)); 

道歉,如果你已經使用mb_detect_order()這樣前面。對其他人的提示:ISO-8859-2應該替換爲你希望找到的其他編碼,可能取決於你所說的語言。在大多數西歐國家,ISO-8859-1是典型的1-字節字符編碼。

無論如何,這允許檢查給定的字符串是否是有效的UTF-8(因此不會改變它),或者如果它不是有效的UTF-8,它會認爲它是ISO-8859-2並轉換它。順序很重要,因爲每個字符串都是有效的ISO-8859-2,您永遠無法「回退」到UTF-8。我當時還假設你說ASCII時,你的意思是ISO-8859-2(它們不是同一件事)。

此外,爲了使我的答案完整,我還想提醒您,您應該確保表中的每列都設置爲使用utf8編碼。