2009-09-30 58 views
4

我正在編寫一些內部和客戶使用的庫,並想知道支持Unicode和ASCII的最佳方法。它看起來像微軟(在MFC庫)使用宏在頭文件中寫入兩個Unicode和ASCII類和做一些與此類似:在C++中創建支持Unicode和ASCII的庫的最佳做法是什麼?

#ifdef _UNICODE 
#define CString CStringW 
#else 
#define CString CStringA 
#endif 

雖然我不是宏的一個巨大的風扇,它工作。如果我使用STL寫庫,它是有意義的編寫包含這樣的事情標題:

#ifdef _UNICODE 
#define GetLastErrorString GetLastErrorStringW 
#else 
#define GetLastErrorString GetLastErrorStringA 
#endif 

std::string GetLastErrorStringA(); 
std::wstring GetLastErrorStringW(); 

或者我應該只是單獨發佈的庫,一個是ASCII,一個用於Unicode的?

想知道人們在這種情況下做什麼是最好的。

UPDATE:解決了一些意見和問題:

  • 這將是C++類庫。
  • 我相信我需要使用UTF-16編碼,因爲我想支持亞洲字符集。
  • 我使用Unicode的原因有兩個:1)所有新的SDK都支持Unicode,我不相信未來的SDK或第三方庫將來會支持單獨的ASCII版本。 2)雖然我們不會完全國際化我們的應用程序,但如果我們能夠處理用戶輸入(如名稱)和從包含亞洲字符的路徑加載的文件,那將會很好。
+0

你正在開發一個平面C風格的API或一組C++類嗎? – Michael 2009-09-30 18:02:57

+0

你的例子有一個問題:你需要別名返回類型的方法,如果你想有任何編譯它的方法本身(儘管你可能不得不在方法的實現中使用#define )。 – 2009-09-30 18:11:56

+0

根據我的經驗,您不需要爲亞洲(CJK)字符使用UTF-16。我的程序使用多字節UTF-8處理它們沒有任何類型的魔法。 – akaltar 2013-07-07 09:47:31

回答

4

我會使庫完全在Unicode內部。然後,一組C++適配器類將存在於ASCII碼中,並傳遞給Unicode實現。

+0

問題是:這是必要的內部使用'Unicode',因爲根據編碼一個普通的std ::字符串可能會做的伎倆。 – 2009-09-30 18:16:26

0

這個問題有點不準確,但...

首先你必須精確的編碼。 Unicode只是字符的表示(每個字符都與一個代碼點相關聯),當涉及在應用程序中處理Unicode時,您必須選擇代碼點將如何表示。如果你可以用UTF-8去,你會不會擔心寬字符,你可以將數據存儲在一個普通的std :: string :)

然後,你必須精確您的問題:

  • 你想支持Unicode和Ascii中的條目嗎?
  • 或者你在說輸出?
  • 有無論如何,你可以使用std :: locale知道你應該輸出哪種編碼?

我正在研究一個國際化的應用程序(一個網站,有一個C++後端...),我們在內部簡單地使用std :: string。 Ascii或Utf-8中的輸出取決於翻譯文件,但數據表示不會因iota而異(除了計算字符,請參閱關於此主題的my post)。

真的,我絕對不是宏迷,因爲utf-8的目的是與Ascii兼容,如果你可以選擇你自己的編碼,你就會被保存!

1

如果先將它們轉換爲UTF-8,則可以將unicode字符串存儲在std :: string中。

您只需要在與UTF-16調用接口時使用wstring,如Windows API。如果是這種情況,您可以在需要時將您的字符串轉換爲本地字符串。這可能有點繁重,但並不是那麼糟糕。

相關問題