在做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()中就可以显示中文了。