2014-01-22 35 views
0

我有每個表有COLLATE ='utf8_general_ci'的mysql db。打開perl上的utf8文件和雙重編碼

我連接到使用DBI表my $db = DBI->connect($cstring, $user, $password),沒有

$db->{mysql_enable_utf8} = 1 
$db->do(qq{SET NAMES 'utf8';}); 

然後選擇表,並用文字:: CSV到MYFILE其中MYFILE被打開,如下面將其複製到CSV文件:

binmode(Myfile, ":utf8") 

,我重複上與開像上面放一些文件,我得到雙重編碼且僅當我刪除這些S中的binmode不同的文件不同的表,這個過程中的問題peicfic文件的問題解決了,而其他文件都很好,編碼爲u​​tf8,如果我刪除binmode他們我得到一個問題在utf8 encdoing可能是什麼問題?

值得一提我試圖用:使用UTF8我的劇本,還試圖用

$db-> {mysql_enable_utf8} = 1 
    $db->do(qq{SET NAMES 'utf8';}); 

,但問題並沒有解決。

+0

當你用binmode':utf8'配置文件時,你需要確保你提供它的字符串是'utf8 :: is_utf8',因爲如果它們不是,它們將從iso-8859-1解碼並且以utf8編碼導致雙重編碼。您必須配置連接才能正確返回標記爲utf-8或「utf8 :: decode」的字符串。 –

+0

或者您可以不使用binmode;那麼它不應該修改編碼。 –

+0

您確定問題不在於某些數據庫表包含雙重編碼值嗎? (即,您所描述的問題可能發生在輸入或輸出上。) – cjm

回答

2

如果我理解正確的話,你看

éëè 

,你使用phpMyAdmin時預計

éëè 

。這表明數據庫中的數據是錯誤的(雙重編碼)。您需要返回並使用正確的數據重新填充數據庫。


如果你不能修復你的數據庫,它是最有可能的安全,只是添加以下內容:

utf8::decode($str); # Fix double-encoding 

它會嘗試將已解碼的數據從數據庫中進行解碼。如果數據是雙重編碼的,這將修復它。如果數據不是雙重編碼的,它將失敗,並在$str中保留正確的值(假設你的字符串不是很奇怪)。

我建議您編寫一個小型工具,從數據庫讀取數據,使用這個技巧修復數據,然後將其正確放回數據庫。

+0

感謝這個答案,它幫助了我很多另一個問題,如果我需要再次使用DBI填充我的數據,並且數據是utf8本身,我應該如何配置dbi? – smith