[英]Getting UTF-8 data from MySQL to the Linux C++ application
顯示從MySQL檢索到基於Linux的C ++應用程序的UTF-8數據,我遇到了很大的麻煩。 UTF文本顯示為問號。
該應用程序使用MySQL C API。 所以我在mysql_init()
和mysql_real_connect()
之前傳遞了UTF-8選項:
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, 'utf8');
和
mysql_options(&mysql,MYSQL_INIT_COMMAND, 'SET NAMES utf8');
但沒有運氣。 測試仍顯示為問號。 我用Perl腳本做了一些測試(我對它更熟悉;))。 如果我為連接指定了UTF-8選項,則文本會正確顯示:
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('SET NAMES utf8');
知道如何在C ++應用程序中正確顯示UTF-8數據嗎?
這可能是一個簡單的錯字。 你寫:
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
的行。
您無需像這樣設置charset選項即可獲得所需的結果。 他們只是幫助DB做排序等合理的事情。
我懷疑你確實以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顯示resetdb放入測試數據庫的UTF-8數據。 有關更多詳細信息,請參閱分發中的README-examples.txt。
我並沒有告訴你切換到MySQL ++,只是將它作為一個已知的工作測試。 一旦你開始工作,你可以修改這些例子以對抗你自己的數據庫,看看它是否會中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.