2012-03-08 70 views
9

Windows API在UNICODE上看起來很大,您在Visual C++中創建了一個新項目,並且默認將其設置爲UNICODE
而我想成爲一名優秀的Windows程序員,我想使用UNICODEC++ UNICODE和STL

的問題是C++標準庫和STL(如的std :: string,或的std :: runtime_error)不UNICODE字符串很好地工作。 我只能傳遞一個的std :: string,或char*的std :: runtime_error,我敢肯定的std :: string不支持UNICODE

所以我的問題是,我應該如何使用諸如 std :: runtime_error?我應該混合UNICODE和常規ANSI? (我認爲這是一個壞主意......)
只需在我的整個項目中使用ANSI? (不喜歡..)或者什麼?

+2

他們是例外,你是否需要國際化他們,真的需要unicode支持他們? – PlasmaHH 2012-03-08 19:30:03

+0

你可以在整個過程中大多使用'std :: wstring'。 'std :: runtime_error'是一個不幸的例外(不是雙關語!)。 – arx 2012-03-08 19:35:51

+1

[Unicode with what()](http:// stackoverflow。com/questions/3760731/exceptions-with-unicode-what) – 2012-03-08 19:39:20

回答

9

一般來說,你不應該混合這兩種編碼。但是,異常消息只是開發人員(例如,在日誌文件中)感興趣的東西,絕不應該向用戶顯示(但請注意Jim的重要注意事項)。

因此,如果您爲整個面向用戶的界面使用UNICODE並且在開發人員消息的幕後仍然使用std::exception等,那麼您就安全了。應該不需要在兩者之間進行轉換。

而且,這是一個很好的技巧可以定義在C typedefUNICODE非依賴性字符串++:

typedef std::basic_string<TCHAR> tstring; 

...和類似定義tcouttcin等有條件:

#ifdef UNICODE 
    std::wostream& tcout = std::wcout; 
    std::wostream& tcerr = std::wcerr; 
    std::wostream& tclog = std::wclog; 
    std::wistream& tcin = std::wcin; 
#else 
    std::ostream& tcout = std::cout; 
    std::ostream& tcerr = std::cerr; 
    std::ostream& tclog = std::clog; 
    std::istream& tcin = std::cin; 
#endif 
+3

我認爲有一種理由認爲,對於像日誌文件這樣的情況,應該使用Unicode字符串。日誌文件通常會將用戶數據與系統數據混合,用戶數據很可能包含Unicode內容。你總是可以假設ANSI異常,但是一個好的異常可能包括一個文件路徑(對於一個沒有找到異常的文件可以說),該路徑可能包含Unicode字符)。 – 2012-03-08 19:40:47

+0

用於typedef技巧。但是如果我想讓錯誤消息顯示給用戶以便他們報告/識別問題呢?編輯:幾乎是吉姆羔羊說的。 – Josh 2012-03-08 19:42:06

+0

@Jim真的。我老實說沒有考慮過。 – 2012-03-08 19:42:06

0

要使用Windows Unicode API,只需使用寬字符串版本 - wstring等。它不會對exception::what()有所幫助,但如果您確實需要Unicode,則可以使用UTF-8編碼。

1

看看在CodeProject上的這篇(相當老的)文章中:Upgrading an STL-based application to use Unicode。它涵蓋了您在廣泛使用STL時可能遇到的問題。它不應該那麼糟糕,並且一般來說,使用寬字符串是值得的。

+1

嗯,這篇文章是非常過時的。例如,它說'wchar_t'是'unsigned short'的typedef,它會導致重載問題。現代編譯器不適用。 – 2012-03-08 19:47:36