看板 C_and_CPP 關於我們 聯絡資訊
首先, 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