标签归档:V8

C++字符串转码处理

公司项目要做一个桌面应用,需要使用nodejs V8编写C++ addon(扩展)。
在C++的方法中获取入参中含有中文时,使用V8 String类下的Utf8Value类,可以构造出UTF-8编码的字符串,代码如下:

String::Utf8Value param1(args[0]->ToString());

String::Utf8Value重载了operator,返回char 类型,所以可以用

std::string str = string(*param1)

这样的方法来创建一个c++的string对象。
这样对于英文来说,是没有问题,但是对于中文,会出现乱码的情况。
一开始搜索资料时,只是将关键字设定为“char*转string 中文乱码”,能找到一些方法,多数如
http://www.blogbus.com/hx1987-logs/211009970.html
这个blog里面说的,但是都不凑效。(不过也不是没有收获,至少还了解到MultiByteToWideChar这个方法和wchar_t这个类型,C++字符转码都是需要MultiByteToWideChar来转换的)
其实这样搜出来的结果,基本上都有一个共同的问题,就是没有说明这个方法是由什么编码转成什么编码。
因为我入参是UTF8编码,而C++的中文编码,是unicode或GBK,所以查找的方向应该是如果将UTF8编码转换成GBK或unicode编码。
分享两篇博文:
关于C++中文字符的处理
VC URLEncode & UrlDecode (这篇的的话是从另外一个方向找到的:我的一个同事说,应为是用node调用,可以在js中先用encodeURI编码后再调用addon,所以我就往这个方向的搜索了一下,但是最后发现,其实在js中用decodeURI时,也是用UTF8来URIencode,所以在C++中使用URIdecode后,还是UTF8编码,不过里面的Utf8ToStringT方法最终帮我解决了问题^-^)

CString Utf8ToStringT(LPSTR str)
{
    _ASSERT(str);
    USES_CONVERSION;
    WCHAR *buf;
    int length = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    buf = new WCHAR[length+1];
    ZeroMemory(buf, (length+1) * sizeof(WCHAR));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, buf, length);

    return (CString(W2T(buf)));
}

能得到正确编码的CString,然后就好办了:
CString,string,char*之间的转换(转)

最后在C++中处理完后,还需要返回中文提示信息,所以需要将GBK转成UTF8~~~~下面的一篇问题贴帮到了我:
http://bbs.csdn.net/topics/320078111
GBK转UTF8

void ConvertGBKToUtf8( CString& strGBK )
{
    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
    WCHAR * wszUtf8 = new WCHAR[len+1];
    memset(wszUtf8, 0, len * 2 + 2);
    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
    char *szUtf8=new char[len + 1];
    memset(szUtf8, 0, len + 1);
    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    strGBK = szUtf8;
    delete[] szUtf8;
    delete[] wszUtf8;
}