在做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,再通过CP_UTF8进行转换,UTF8可以视为一种变长的多字节编码,虽说UTF8是对UNICODE字符集 执行的一种编码形式,但其编码是采用1~6字节变长编码,所以可以视为多字节编码。所以示例代码如下:
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()中就可以显示中文了。