Re: [問題] C++/MFC 與 MySQL++ 亂碼問題

看板C_and_CPP (C/C++)作者 (Seoker)時間14年前 (2012/02/01 15:33), 編輯推噓5(5016)
留言21則, 3人參與, 最新討論串2/3 (看更多)
抱歉,試到現在還是不成功,再上來問一下大家 首先,先請各位幫我澄清一下我的觀念有沒有問題: 1. Unicode 不等於 UTF-8Unicode3 個位元,而 UTF-8 則用 1~4 個位元不等 2. CString 為中性的,看 Project 的設定, 用 Unicode 的話就等同於 CStringW,否則等同 CStringA 3. MySQL++ 用 std::string, 接到的資料是 std::string,query 吃的也是 std::string 4. std::string 也是 ANSI,可以自由轉換 CStringA 沒問題 (這裡我比較不清楚..) 我在試的時候,以下三行是必加的 SET NAMES utf8 COLLATE utf8_unicode_ci SET CHARACTER_SET_CLIENT=utf8 SET CHARACTER_SET_RESULTS=utf8 我嘗試過: (1) ( i) std::string => CString (ii) CString => CStringA => query 以上解決部分,但仍是有字碼無法顯示,或問號 好像在第一步轉成 CString 的時候就有問題了 (2) ( i) std::string => MB2WC(CP_ACP、CP_UTF8都試過) => w_char* => CString (ii) CString => WC2MB(CP_ACP、CP_UTF8) => char* => CStringA 英文字OK,但他國字碼顯示不出、顯示問號,比 (1) 結果還慘 (3) ( i) std::string => CStringA => CA2W => CString (ii) CString => CW2A => CStringA 結果同 (2) 更正確的來說,我的字串是用 CMapStringToString 存下來(這應該沒差吧?) 我試到快瘋了 O_Q 不知道是那邊有問題 還是觀念有錯 .. 在這邊跟各位請教了 m(_ _)m -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.63.100.2 ※ 編輯: seoker 來自: 210.63.100.2 (02/01 15:41)

02/01 15:41, , 1F
1.Unicode有很多種,常見的就UTF-8、UTF-16(又分LE跟BE)
02/01 15:41, 1F

02/01 15:42, , 2F
VC/Windows用的是UTF-16(LE)
02/01 15:42, 2F

02/01 15:42, , 3F
2.YES 剩下的MySQL部分我就沒碰過了...
02/01 15:42, 3F

02/01 15:44, , 4F
4.std::string是ANSI字元,Unicode會用std::wstring
02/01 15:44, 4F

02/01 15:46, , 5F
不過MySQL++如果不支援Unicode,那遇到同時有中/日/韓等
02/01 15:46, 5F

02/01 15:46, , 6F
多語系時真的不會有問題嗎?
02/01 15:46, 6F

02/01 15:46, , 7F
謝謝樓上回答,所以我 std::string 拿出來
02/01 15:46, 7F

02/01 15:47, , 8F
如果直接存成 CString 就會有問題囉?(認不出編碼之類的)
02/01 15:47, 8F

02/01 15:48, , 9F
std::string→CStringW 要MB2WC
02/01 15:48, 9F

02/01 15:50, , 10F
我覺得你可以trace看看memory中存的值,在哪一步轉換時
02/01 15:50, 10F

02/01 15:50, , 11F
我只覺得你的轉來轉去讓我看得好頭暈...XD
02/01 15:50, 11F

02/01 15:50, , 12F
出錯了。一些文字編輯器可以看到該字元的16進位值
02/01 15:50, 12F

02/01 15:51, , 13F
(如UltraEdit)
02/01 15:51, 13F

02/01 15:54, , 14F
同意直接把字元的Binary內容印出來看,看它到底怎麼轉
02/01 15:54, 14F

02/01 15:54, , 15F
我猜問題是出在UTF-8的轉換...
02/01 15:54, 15F

02/01 17:26, , 16F
感謝各位,我解決了 O_Q 原來用MB2WC、WC2MB可以
02/01 17:26, 16F

02/01 17:26, , 17F
之前試不成功,原因在於有成功轉過去,但轉回來改錯地方XD
02/01 17:26, 17F

02/01 17:27, , 18F
搞笑了||| 拍謝 (maintain 舊 code 好煩阿~~QQ)
02/01 17:27, 18F

02/01 17:27, , 19F
有幫忙解答的人,小弟贈送200P幣(稅前)以表心意
02/01 17:27, 19F

02/01 17:32, , 20F
恭喜耶,而且你也太客氣了,我又沒幫上忙XDDD
02/01 17:32, 20F

02/01 19:08, , 21F
有回的人就有嘛XD
02/01 19:08, 21F
文章代碼(AID): #1FAEhP_Q (C_and_CPP)
文章代碼(AID): #1FAEhP_Q (C_and_CPP)