2008年7月22日 星期二

[C++] printf 印出 Unicode 字元是亂碼 ?

如果你寫下面的程式

printf("%s\n",L"測試 printf %s (寬字元測試)");

我想你執行的結果應該是這樣

1

這是因為你用原生的 code page 去解釋 UTF-16 編碼的字串 "測試 printf %s (寬字元測試)". 這樣會造成亂碼.

解決方案:

Step 1: 告訴你的 C++ Runtime Library, 目前所有的字元都是用 Chinese Taiwan 來解釋.

setlocale(LC_ALL,"Chinese_Taiwan.950");

Step 2: 用 %S (大 S) 印出 UTF-16 的字串

printf("%S\n",L"測試 printf %S (寬字元測試)");

2

如果想用 _tprintf 來顯示 UTF-16 編碼字元, 該怎麼做?

用 %s (小s)

_tprintf(_T("%s\n"), _T("_tprintf %s (T 版本字元測試)"));

(注意: 你還是要在前面加 setlocale(LC_ALL,"Chinese_Taiwan.950");, 否則還是會出現亂碼) thanks 網友 Ericly.

下面是一個簡單的測試範例:

Demo.cpp Makefile 完整專案

(注意: 因為我編譯時, 加了 UNICODE 與 _UNICODE, 故所有的寬字元都會被編成 UTF-16, 詳情請看 Makefile 設定)

執行結果:

snap003

by Jing

延伸閱讀

1. 用 fprintf 寫入的 Unicode 字串, 讀出是亂碼 ?

沒有留言:

張貼留言