作者LPH66 (1597463007)
看板C_and_CPP
標題Re: [問題] 中文字串無法轉成Unicode
時間Tue Apr 1 23:44:19 2014
首先,
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
推 ttfor:詳細推,我先研究cwchar,謝謝! 04/02 15:01
推 QQ29:典故典故在exe是不是看os預設字形有可能是big5? 04/03 15:54
→ LPH66:你不加 L 就是了 (正確說來不加 L 的編碼跟原始檔編碼相同) 04/04 01:12
→ LPH66:加了 L 則一定會是 wchar_t 04/04 01:18
→ purincess:不過wchar_t不一定就會是"unicode" 04/04 02:06
→ purincess:再加上unicode有好多種format...... 04/04 02:06
→ LPH66:嗯, C++11 引入了 char16_t 跟 char32_t 試圖解決這個問題 04/04 04:31
→ LPH66:不過它就沒有像 wchar_t 這裡有的這些函式了 04/04 04:33
→ purincess:樓上這麼晚睡 雖然今天放假 但是平常上班ok嗎orz 04/04 13:10