为何Unicode中文字符转换UTF-8 结果是乱码

为什么Unicode中文字符转换UTF-8 结果是乱码
请问,各位熟悉编码方式的,为什么在转换UTF8编码之后,结果出现乱码,不知道哪里出错了

 

wchar_t  pUnicode[]=L"中国";
 
char* pTransText;
pTransText=UnicodeToUTF_8(pUnicode);
CString  strTest=pTransText;
MessageBox(strTest);

char* UnicodeToUTF_8(wchar_t* pText)
{
 
    int u8Len = WideCharToMultiByte(CP_UTF8,NULL,pText,-1,NULL,0,NULL,NULL); 
char* pOut = new char[u8Len + 1]; 
    memset(pOut,0,u8Len + 1);
    WideCharToMultiByte(CP_UTF8,NULL,pText,-1,pOut,u8Len,NULL,NULL); 

    return pOut;
}

------解决方案--------------------
没有错, 也没有乱.
有问题的是:
CString  strTest=pTransText;
char 给 CString , 然后MessageBox显示出来.


------解决方案--------------------
UTF8字符串在调试的时候显示乱码很正常,因为你的调试环境把char*当成多字节字符串对待
------解决方案--------------------
utf8 直管发送就是, 对方自然能够理解.
如果要显示, 要么用本地locale(GBK,GB2312)
要么用unicode

utf8 只是 unicode 的一种传输编码,
本质还是 unicode 的
------解决方案--------------------
所以, 严格意义上, utf8 算不上一种编码
------解决方案--------------------
WideCharToMultiByte是转MBCS的,不是转UTF8的。

UTF8,只是一种方便的编码,不是一种国家或者国际标准。


------解决方案--------------------
http://www.cnblogs.com/xdotnet/archive/2007/11/23/unicode_and_utf8.html
------解决方案--------------------
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

------解决方案--------------------
有道不认识, 可能缺少 BOM 头,
你加上试试. 什么是 BOM 头, 你搜搜.

再不行, 先把文本写到文件中, 用记事本打开看看.

------解决方案--------------------
sprintf之后再转成UTF8。 sprintf很可能无法正确处理utf-8字符
------解决方案--------------------
应该使用 swprintf,或者_sprintf_l。(这二者应该都是MS扩展)。

另外如果你的代码文件以utf-8格式保存,"中国" 应该就是utf-8编码的。
或者使用c++11的 u8"中国"

引用:
sprintf之后再转成UTF8。 sprintf很可能无法正确处理utf-8字符

------解决方案--------------------
引用:
Quote: 引用:

WideCharToMultiByte是转MBCS的,不是转UTF8的。

UTF8,只是一种方便的编码,不是一种国家或者国际标准。


那请问,到底该如何才能提交UTF8的 中文字符 啊,因为有道翻译那边要求提交数据是 UTF8的

搜一下UTF8 的代码转换器或者库,不然使用支持UTF8的操作系统,和编译器
好象C++ 11 支持 UTF8字符串。

个人感觉 UTF8 这个好东西,会造成更大的混乱。
因为现在有三种字符类型数据,都是 char 类型。
1)ASCII //美国政府---美国相关标准机构--制定的标准。 
        //1字节表示。
2)MBCS  //各国或者地区---制定的标准,在计算机内的实现。 
        //1~2 字节表示(汉字),1~n字节表示(其他语言)。
3)UTF8  //(linux 社区?互联网??)产生的标准或者实践。
        //1~3?个字节表示。

UTF8 和 MBCS一样是一种变长编码。
可能需要自己做个转换器。

------解决方案--------------------
//header
class strCoding
{
public:
    strCoding(void);
    virtual ~strCoding(void);

    void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//utf_8转为gb2312
    void GB2312ToUTF_8(string& pOut,char *pText, int pLen); //gb2312 转utf_8
    string UrlGB2312(char * str);                           //urlgb2312编码
    string UrlUTF8(char * str);                             //urlutf8 编码
    string UrlUTF8Decode(string str);                       //urlutf8解码
    string UrlGB2312Decode(string str);                     //urlgb2312解码