日期:2014-05-16  浏览次数:20327 次

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,再通过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()中就可以显示中文了。