2009-10-08 86 views
2

我在從MySQL檢索到的基於Linux的C++應用程序中顯示UTF-8數據時遇到了很大的麻煩。 UTF文本顯示爲問號。從MySQL獲取UTF-8數據到Linux C++應用程序

該應用程序使用MySQL C API。因此,我通過了UTF-8選項mysql_init()mysql_real_connect()前:

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

mysql_options(&mysql,MYSQL_INIT_COMMAND, 'SET NAMES utf8'); 

但沒有運氣。測試仍顯示爲問號。我用Perl腳本做了一些測試(我更熟悉它))。

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

不知道如何在正確的C++應用程序中顯示UTF-8的數據:如果我指定用於連接的UTF-8選項的文本顯示正確?

+1

如何檢索和顯示數據?涉及哪些功能和數據類型? – Darryl 2009-10-08 20:50:24

回答

3

你不需要設置字符集選項就可以得到你想要的結果。他們只是幫助數據庫做排序等合理的事情。

我懷疑你的確在以UTF-8格式獲取你的數據,但是沒有正確處理它。在C中傳遞UTF-8是世界上最簡單的事情。讓它正確打印可能更具挑戰性,但這當然不是MySQL的問題。

根據你對這篇文章的標籤,我假設你在Linux上運行這個程序。如果是這樣,你應該簡單地將它打印到控制檯(printf(),cout,不管),以獲得正確的表示,因爲Linux控制檯現在幾乎總是默認爲UTF-8。檢查你的LANG環境變量。

在處理Unicode時,編寫只能得到非常少量非ASCII數據的測試程序會很有幫助 - 單個字符最好 - 僅打印出來,然後將該程序的輸出重定向到文件。然後在十六進制編輯器中查看該文件,並將其與至少UCS-2LE進行比較,以查看是否只是看到錯誤的編碼。

我是MySQL++的維護者,可以告訴你,MySQL ++在Linux上很自然地處理UTF-8,但我們不玩任何遊戲來實現它。我不明白爲什麼直C API代碼不應該表現得自然。您可以嘗試在您的系統上構建MySQL ++並運行示例,因爲它們包含UTF-8測試。運行resetdb進行設置,然後使用simple1顯示重新放入測試數據庫的UTF-8數據。有關更多詳細信息,請參閱發行版中的README-examples.txt。

我不告訴你切換到MySQL ++,只是使用它作爲已知工作的測試。一旦你得到它的工作,你可以修改這些例子來對付你自己的數據庫,看看它是否中斷。

+0

謝謝你的回答,沃倫。我已經找到了一種在C++應用程序中正確顯示UTF8數據的方法。我只是在my.cnf中設置了這些選項:

 [mysqld] init_connect='SET NAMES utf8; SET collation_connection = utf8_general_ci;' default-character-set=utf8 character-set-server=utf8 collation-server=utf8_general_ci skip-character-set-client-handshake 
並且它幫助了:) – michael 2009-10-12 07:30:41

+0

我想到了一種可以獲得該行爲的方法:如果表的默認字符集不是UTF-8。在這種情況下,您所做的是在每次訪問時強制進行轉換。緩慢而沉重。最好先將數據存儲在UTF-8中。 – 2009-10-12 14:24:52

6

這可能是一個簡單的錯字。你寫:

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8'); 

單引號是用於指定字符文字,而不是字符串。因此,將其更改爲:

mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

此外,請檢查mysql的類型。如果是MYSQL *,然後寫:

mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "utf8"); 

這同樣適用於與MYSQL_INIT_COMMAND行。

+0

非常感謝! 這個'mysql_set_character_set(myData,「utf8」);'不適合我。 您的代碼'mysql_options(myData,MYSQL_SET_CHARSET_NAME,「utf8」);'很好用! – David 2013-03-20 00:08:06

相關問題