看板 C_and_CPP 關於我們 聯絡資訊
抱歉,試到現在還是不成功,再上來問一下大家 首先,先請各位幫我澄清一下我的觀念有沒有問題: 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)
lwecloud:1.Unicode有很多種,常見的就UTF-8、UTF-16(又分LE跟BE) 02/01 15:41
lwecloud:VC/Windows用的是UTF-16(LE) 02/01 15:42
lwecloud:2.YES 剩下的MySQL部分我就沒碰過了... 02/01 15:42
lwecloud:4.std::string是ANSI字元,Unicode會用std::wstring 02/01 15:44
lwecloud:不過MySQL++如果不支援Unicode,那遇到同時有中/日/韓等 02/01 15:46
lwecloud:多語系時真的不會有問題嗎? 02/01 15:46
seoker:謝謝樓上回答,所以我 std::string 拿出來 02/01 15:46
seoker:如果直接存成 CString 就會有問題囉?(認不出編碼之類的) 02/01 15:47
lwecloud:std::string→CStringW 要MB2WC 02/01 15:48
lwecloud:我覺得你可以trace看看memory中存的值,在哪一步轉換時 02/01 15:50
james732:我只覺得你的轉來轉去讓我看得好頭暈...XD 02/01 15:50
lwecloud:出錯了。一些文字編輯器可以看到該字元的16進位值 02/01 15:50
lwecloud:(如UltraEdit) 02/01 15:51
james732:同意直接把字元的Binary內容印出來看,看它到底怎麼轉 02/01 15:54
lwecloud:我猜問題是出在UTF-8的轉換... 02/01 15:54
seoker:感謝各位,我解決了 O_Q 原來用MB2WC、WC2MB可以 02/01 17:26
seoker:之前試不成功,原因在於有成功轉過去,但轉回來改錯地方XD 02/01 17:26
seoker:搞笑了||| 拍謝 (maintain 舊 code 好煩阿~~QQ) 02/01 17:27
seoker:有幫忙解答的人,小弟贈送200P幣(稅前)以表心意 02/01 17:27
james732:恭喜耶,而且你也太客氣了,我又沒幫上忙XDDD 02/01 17:32
seoker:有回的人就有嘛XD 02/01 19:08