簡體   English   中英

從MySQL獲取UTF-8數據到Linux C ++應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM