1

我有一個套接字,我通過它發送序列化的std :: wstring,例如,讓我們說,從中文版的Windows到使用阿拉伯語UI的Unix系統。發送std :: wstring從「中國Windows」發送到「阿拉伯語Windows」

我不明白我的Unix系統(或其他)如何知道這些std :: wstring是中國人的,我沒有看到「code page」(又名國家語言?)存儲在std :: wstring,我必須將自己關聯潛在每個std :: wstring的代碼頁嗎?

我錯過的東西是肯定的,因爲這看起來就像在我們相互關聯的世界的一個基本問題......

感謝,

回答

3

wstring的目的是爲了讓整個Unicode字符集,其中包括中國和阿拉伯語和其他所有人都知道的字符集。它幾乎完全廢棄了代碼頁的概念 - 這些字符在基於任何語言的計算機上具有相同的表示形式。

請參閱The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)初學者。

傳輸中可能會遇到一些問題,因爲wchar_t通常在Windows上是16位,在Linux上是32位。也可能會有一些需要擔心的大端和小端問題。最安全的做法是通過UTF-8進行傳輸,UTF-8將Unicode字符編碼爲8位字節的序列,這些字節是明確的。

1

一般來說,wstring被編碼爲unicode編碼,它們是語言中立的。無論您在自己的計算機上使用何種語言設置,wstring的內容都是相同的(這是Unicode的主要優點之一!)。

但是,請注意,有多個Unicode編碼,並且Unix平臺通常使用與Windows不同的一種(UCS-32與UTF-16)。我建議顯式轉換爲UTF-8以便在機器之間傳輸;在Windows上使用WideCharToMultiByte(與CP_UTF8)和unixen使用iconv()在您的本地wstring編碼與UTF-8之間轉換(在Unix上,更常見的是在任何地方簡單地使用UTF-8,注意 - 在這種情況下,您會使用正常的std::string在Unix端有UTF-8文本)。