2010-10-23 130 views
3

問候,字符編碼問題

我正在開發在C + +項目,我想使用的字符,如á é õ┌ ─ ┐ │劃出一道漂亮的情侶幀。我的疑問在於我的代碼/項目設置應該改變,因爲沒有任何修改,控制檯就會打印僞隨機字符。

我知道上述字符是在字符集代碼頁437又名擴展ASCII中定義的,但是我應該知道的是什麼?

經過一番研究,我收錄了指令setlocale(LC_CTYPE, "");,現在我可以打印重音字符(àéõ),但不能打印邊框。

此外,我是否應該使用charstringwcharwstring來使用這些字符?

感謝

+0

您的應用程序可能正在使用特定的本地。但終端使用什麼本地/字符編碼來顯示字符? – 2010-10-23 22:50:45

回答

2

我認爲這樣做是使用WCHAR和wstring的的人物的最好方式 - 他們都是爲了區域設置獨立的字符串操作,並在Windows和UTF-被定義爲UTF-16 32在Linux中。

請注意,您需要使用適當的功能,例如wprintf,而不是printf ...如果你正在使用iostream,我認爲應該工作外的開箱即用的wstrings。

編輯:請注意,wchar_t是unicode(實際上,它通常是)不是必需的。如果wchar_t(因此wstring)是unicode,那麼C99標準(因此很可能是C++標準)指出要定義__STDC_ISO_10646__

換句話說,如果定義了__STDC_ISO_10646__,那麼wchar_t是unicode - 至於確切類型(UTF-16或UTF-32),可以使用sizeof(wchar_t)。

+0

在C++(基於C89,而不是C99)中,編碼wchar_t和std :: wstring具有的是實現細節,儘管您在Windows/Linux中聲明的是常見的情況。對於流IO,使用'std :: wcout','std :: wcin'等。 – sbi 2010-10-23 22:49:57

+0

我刪除了'setlocale(LC_CTYPE,「」);'因爲wchar和wstring是語言環境獨立的。但是現在,編譯器輸出錯誤'轉換爲執行字符集:非法字節序列',其操作類似於'std :: wstring maintenance = L「Manutenção」;'發生了什麼? – 2010-10-25 13:16:11

+0

@sbi:同樣適用於C99,它依賴於實現 - 但是,正如我所說,如果wchar_t是__STDC_ISO_10646__,它就是Unicode的某種形式。 – 2010-10-25 17:11:19

0

要了解要使用的Unicode字符查找http://unicode.org/charts/並搜索「框繪製」。該集包括CP 437中的字符,但也包括其他許多字符。下一個問題是您的設備是否可以顯示部分或全部。