2010-11-19 131 views
0

我想通過使用winsock的網絡發送文本數據包。然而,文本存儲爲wchar_t,我需要能夠將文本轉換爲字節(char)格式以通過網絡發送,然後將其轉換回wchar_t。使用winsock通過網絡發送Unicode(win32)文本數據包?

我已經嘗試過使用ostringstream並將我的wchar_t字符串轉換爲字節格式,但是當我嘗試去反轉時,我得到了一堆亂碼。

我在網上查找時似乎找不到任何答案,所以任何幫助都會非常感激。

好的,這裏有一些我玩過的代碼。

std::wstring text(ieS("Hello")); 
std::ostringstream ostr; 
ostr.imbue(std::locale()); 
ostr << text.c_str(); 
std::string text2 = ostr.str(); 

轉換爲std :: string以獲取char格式。

std::wostringstream wostr; 
wostr.imbue(std::locale()); 
wostr << text2.c_str(); 
text = oss.str(); // gibberish 

轉換回爲std :: wstring的獲得wchar_t的格式...

+0

發佈一些代碼。 – 2010-11-19 02:08:39

+0

您需要詳細瞭解Unicode是如何表示的 - 聽起來好像您對長度等有一些假設。當字節到達時,您需要提供足夠的信息來了解如何將字節解碼爲Unicode字符。 – 2010-11-19 02:17:17

+0

在任何情況下,當事情都在網絡上時,您應該使用UTF-8。 – 2010-11-19 02:21:27

回答

1

你這裏的朋友們:

調用WideCharToMultiByte,傳遞用於UTF-8的代碼頁作爲MB代碼頁。

MultiByteToWideChar,同上。

0

來自實例here轉貼:

#include <locale> 
#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std ; 

wstring widen(const string& str) 
{ 
    wostringstream wstm ; 
    const ctype<wchar_t>& ctfacet = 
         use_facet< ctype<wchar_t> >(wstm.getloc()) ; 
    for(size_t i=0 ; i<str.size() ; ++i) 
       wstm << ctfacet.widen(str[i]) ; 
    return wstm.str() ; 
} 

string narrow(const wstring& str) 
{ 
    ostringstream stm ; 
    const ctype<char>& ctfacet = 
         use_facet< ctype<char> >(stm.getloc()) ; 
    for(size_t i=0 ; i<str.size() ; ++i) 
        stm << ctfacet.narrow(str[i], 0) ; 
    return stm.str() ; 
} 

int main() 
{ 
    { 
    const char* cstr = "abcdefghijkl" ; 
    const wchar_t* wcstr = widen(cstr).c_str() ; 
    wcout << wcstr << L'\n' ; 
    } 
    { 
    const wchar_t* wcstr = L"mnopqrstuvwx" ; 
    const char* cstr = narrow(wcstr).c_str() ; 
    cout << cstr << '\n' ; 
    } 
} 
+0

這不會使用UTF-8嗎? – bmargulies 2010-11-19 03:00:18

+0

我在一個普通的cmd窗口中測試了這些,並且在wchar_t和char之間來回轉換,但是我也想知道這是否適用於UTF-8?有沒有辦法測試它? – Sent1nel 2010-11-19 03:06:16