Chrome开发JS调用NPRuntim崩溃,STRINGZ_TO_NPVARIANT不能返回中文字符串
在做JS和NPRuntime交互的时候,在js的函数返回字符串,总是崩溃。
跟踪发现,是STRINGZ_TO_NPVARIANT(m_szTextGui, *result);的问题。
插件在处理输出的时候,如果是字符串,必须NPN_MemAlloc来分配一个内存。
所以写如下的代码:
sprintf( m_szTextGui, "%s", "abcefghij" );int len = strlen(m_szTextGui)+1;NPUTF8 *utf8_chars = static_cast<NPUTF8 *>(NPN_MemAlloc(len)); memset( utf8_chars, 0, len );strncpy( utf8_chars, m_szTextGui, len);STRINGZ_TO_NPVARIANT(utf8_chars, *result);
能够正常显示。JS的alert(),也正确。
但是当我的字符串变成中文的时候。发现中文不显示。后来发现是字符串转换的问题。
要把GB2312转成utf8才可以。
没有一种方法可以直接将GB2312转换成UTF8,所以这里就要先转UNICODE,再sprintf( m_szTextGui, "%s", "abcefghij中文" );int nLen = MultiByteToWideChar(CP_ACP, 0, m_szTextGui, -1, NULL, 0);if (nLen == 0)return false;WCHAR *pwszBuffer = new WCHAR[nLen]; nLen = MultiByteToWideChar(CP_ACP, 0, m_szTextGui, -1, pwszBuffer, nLen);if (nLen == 0)return false; nLen = WideCharToMultiByte(CP_UTF8, 0, pwszBuffer, -1, NULL, 0, NULL, NULL);if (nLen == 0)return false;char *pszBuffer = new char[nLen]; nLen = WideCharToMultiByte(CP_UTF8, 0, pwszBuffer, -1, pszBuffer, nLen, NULL, NULL); if (nLen == 0)return false;nLen = strlen(pszBuffer)+1;NPUTF8 *utf8_chars = static_cast<NPUTF8 *>(NPN_MemAlloc(nLen)); memset( utf8_chars, 0, nLen );strncpy( utf8_chars, pszBuffer, nLen);STRINGZ_TO_NPVARIANT(utf8_chars, *result); if (pszBuffer)delete []pszBuffer; if (pwszBuffer)delete []pwszBuffer;
这样就在JS的alert()中就可以显示中文了。