Re: [問題] 中文字串無法轉成Unicode

看板C_and_CPP作者 (1597463007)時間10年前 (2014/04/01 23:44), 編輯推噓2(207)
留言9則, 4人參與, 最新討論串2/2 (看更多)
首先, L"字串" 這玩意的型態是 wchar_t* 如果你想要你的程式裡的字串全部都是這種的話 除了 C 字串的型態要用 wchar_t* 之外, 其他的字串相關函式都要用帶 w 的 例如 wprintf, wscanf, wcscpy, wcscmp, fgetws...等等 (詳細列表請參見 <cwchar> http://en.cppreference.com/w/cpp/header/cwchar 並且這個標頭檔也得要引入才有這些函式用) C++ 的字串型別也一樣, 要用 std::wstring (這倒不必另外引入別的標頭檔, 畢竟這只是個 typedef 它其實是 std::basic_string<wchar_t> 跟 std::string (aka. std::basic_string<char>) 只差在模版參數不同而已) 再來, 其實這種方式雖然確實有轉換了 但應該不是你所想的在執行時才把那個字串轉過去 而是編譯時就已經幫你轉好了寫在執行檔裡面的 也因此, 你的 L"典故" 在執行檔裡已經是一個大小為 3 的 wchar_t 陣列 內容依序是 0x5178, 0x6545, 0x0 再經過前篇推文說的所謂"很多巧合"之後就變成你的第一支程式的結果了 若是想要在執行時期把字串轉換的話 這除了要用什麼函式是個問題之外 (這裡先給個簡答: <cwchar> 裡有帶 mb 的那些函式就是了 不過有些眉角要顧) 還有一個大問題是你知不知道你的字串來源的編碼是什麼 不幸的是, 這是個 case by case 的問題, 無法一一詳述 因為這包含了該字串原本儲存的型式、該字串的讀入方式、以及讀入後對它的操作 這不是三言兩語就能解釋的清楚的 -- ˊ_▂▃▄▂_ˋ. ◣          ▅▅ ▅▅ ι●╮   ./◤_▂▃▄▂_◥ \'▊   HARUHI █████ <■┘   ◤◤◥█◥◥█Δ   ISM    By-gamejye ¢|\   ▌▌ζ(▏●‵◥′●)Ψ ▏           █    ⊿Δ    /|▋ |\ ▎         ハルヒ主義      ▄█ ◥◥|◣ ‵′ ◢/'◢◢S.O.S 世界をいに盛り上げるための宮ハルヒの    -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1396367063.A.689.html

04/02 15:01, , 1F
詳細推,我先研究cwchar,謝謝!
04/02 15:01, 1F

04/03 15:54, , 2F
典故典故在exe是不是看os預設字形有可能是big5?
04/03 15:54, 2F

04/04 01:12, , 3F
你不加 L 就是了 (正確說來不加 L 的編碼跟原始檔編碼相同)
04/04 01:12, 3F

04/04 01:18, , 4F
加了 L 則一定會是 wchar_t
04/04 01:18, 4F

04/04 02:06, , 5F
不過wchar_t不一定就會是"unicode"
04/04 02:06, 5F

04/04 02:06, , 6F
再加上unicode有好多種format......
04/04 02:06, 6F

04/04 04:31, , 7F
嗯, C++11 引入了 char16_t 跟 char32_t 試圖解決這個問題
04/04 04:31, 7F

04/04 04:33, , 8F
不過它就沒有像 wchar_t 這裡有的這些函式了
04/04 04:33, 8F

04/04 13:10, , 9F
樓上這麼晚睡 雖然今天放假 但是平常上班ok嗎orz
04/04 13:10, 9F
文章代碼(AID): #1JEjxNQ9 (C_and_CPP)
文章代碼(AID): #1JEjxNQ9 (C_and_CPP)