Chrome开发JS调用NPRuntim崩溃,STRINGZ_TO_NPVARIANT不能返回中文字符串

news/2024/7/19 14:08:23 标签: STRINGZ_TO_NPVARIANT, JS, NPRuntime, C++, 浏览器

在做JSNPRuntime交互的时候,在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()中就可以显示中文了。

 

 

 

 

 

 


http://www.niftyadmin.cn/n/1285914.html

相关文章

浏览器和js交互、NPAPI之NPRuntime开发

前面介绍过NPRuntime &#xff1a; NPAPI 原本是由 Netscape 所制定的一组单纯的 C Plugin API&#xff0c;起初是无法支持 Scriptability&#xff1b;于是到了 2004 年底&#xff0c;各家 Browser (IE, Opera, Mozilla 等) 都同意支持NPRuntime 延伸 API 以支持 Scriptabilit…

ubuntu 英文环境下ibus的安装

ibus是一个框架&#xff0c;可以支持多种输入法&#xff0c;像是pinyin&#xff0c;五笔等。 刚开始学linux系统&#xff0c;默认是英文系统&#xff0c;安装中文的输入法如下&#xff1b; 1.CtrlAltT启动terminal后输入以下命令: 2.输入以下命令&#xff1a;sudo apt-get in…

项目原型设计

作业描述 课程软件工程1916|W(福州大学)团队名称修&#xff01;咻咻&#xff01;作业要求项目原型设计团队目标切实可行的计算机协会维修预约平台开发工具Axue RP 8原型下载修&#xff01;咻咻&#xff01;维修平台原型设计PDF下载修咻咻原型设计PDF团队信息 队员学号队员姓名个…

浏览器开发-插件调js,js再调插件中方法,js不执行

最近在做插件的开发&#xff0c;在插件直接掉js的方法&#xff0c;是可以的&#xff0c;但是我要求插件调js的方法&#xff0c;js的方法又调插件中的方法&#xff0c;&#xff08;因为可能js中的变量要变化&#xff0c;由外边来设定&#xff09;这样就怎么试都不可以。后来发现…

蚂蚁金服开源服务注册中心 SOFARegistry

SOFAStack&#xff08;Scalable Open Financial Architecture Stack &#xff09;是蚂蚁金服自主研发的金融级分布式架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#xff0c;是在金融场景里锤炼出来的最佳实践。本文根据 SOFA Meetup#1 北京站 现场分享整理&…

NPAPI-浏览器开发之网络文件SRC下载(NPN_GetURLNotify,NPP_NewStream....)

在做插件的开发&#xff0c;当遇到插件的配置在服务器上时&#xff0c;这时候要把配置文件下载到本地&#xff0c;把本地的文件路径传递给插件&#xff0c;让插件来读取配置文件&#xff0c;这样比把文件下载到内存&#xff0c;要占用空间要小。 查询NPAPI相关文档&#xff1a…

多个dll延迟加载

1.添加delayimp.lib 2.添加要延迟加载的dll 3.设置卸载选项。 4.多个dll放置的目录设置 如下&#xff1a; 2. 3. 4.设置dll延迟加载的目录 class CDelayDll { public:CDelayDll(){TCHAR tmp[MAX_PATH] {0};unsigned long size ::GetModuleFileName(GetModuleHandle("…

linux禁止root用户直接登录sshd并修改默认端口

linux禁止root用户直接登录sshd并修改默认端口一、Linux最高权限用户root&#xff0c;默认可以直接登录sshd。为了提高服务器的安全度&#xff0c;需要对它进行禁止&#xff0c;使得攻击者无法通过暴力破解来获取root权限。 1,新建一个用户&#xff1b; 2,为新用户设置密码&…