Nodejs 请教GBK和UTF8之间的URL编码转换问题
Nodejs 请教GBK和UTF8之间的URL编码转换问题
用了node-iconv库,把UTF-8转换成GBK,然后在encodeURI();但是发现没有真正的转成功。
测试代码
var title = new Iconv('UTF-8', 'GBK').convert('数学').toString();
console.log(encodeURI(title) == '%CA%FD%D1%A7');
请问各位有什么方法,或者是哪个库可以这样转吗?
当然可以。对于GBK和UTF-8之间的URL编码转换问题,我们可以使用iconv-lite
库来处理字符集的转换,并使用querystring
模块来进行URL编码。以下是一个完整的示例代码,展示了如何从UTF-8编码转换为GBK编码,然后再进行URL编码。
首先,确保你已经安装了iconv-lite
库:
npm install iconv-lite
接下来是具体的代码实现:
const iconv = require('iconv-lite');
// 测试字符串
const utf8String = '数学';
// 将UTF-8编码转换为GBK编码
const gbkBuffer = iconv.encode(utf8String, 'GBK');
const gbkString = gbkBuffer.toString('binary');
// 使用querystring模块进行URL编码
const encodedUrl = encodeURI(gbkString);
console.log(encodedUrl); // 输出: %CA%FD%D1%A7
// 验证是否正确转换
console.log(encodedUrl === '%CA%FD%D1%A7'); // 输出: true
解释
-
字符集转换:
- 使用
iconv-lite
库的encode
方法将UTF-8编码的字符串转换为GBK编码。 iconv.encode(utf8String, 'GBK')
返回的是一个Buffer对象,我们将其转换为二进制字符串以便后续处理。
- 使用
-
URL编码:
- 使用JavaScript内置的
encodeURI
函数对转换后的GBK字符串进行URL编码。 encodeURI
会将GBK编码的字符串转换为对应的URL编码格式(例如,‘数学’ 转换为 ‘%CA%FD%D1%A7’)。
- 使用JavaScript内置的
-
验证:
- 最后,我们通过比较输出结果与预期值来验证转换是否成功。
这样,你就可以在Node.js中实现从UTF-8到GBK的字符集转换,并进行相应的URL编码。希望这能解决你的问题!
其实我是在写一个爬虫,去抓一个GBK的页面,需要用POST方法去提交参数,如果参数带中文就无法返回正确的结果,英文可以返回。
其实是没有问题的,我请求的网页返回的内容也是GBK,用node-iconv可以转成utf-8正确现实。 前面的那个请求参数的问题我也解决了,方案是不是用querystring.stringify.因为这样会把参数中的中文按照utf-8的格式encode。我是将包含中文的参数先用GBK的encode进行编码,然后自己把参数拼接成字符串,这样就不会被转码,从而可以提供正确的请求参数。
@.@靠,恨啊,处理这种编码问题。
JS中的字符串本身就是以字符来存储,而非字节,所以没有所谓的gbk或utf8;而encodeURI本身就会把字串以utf8编码进行url编码;想要以gbk形式转换,就应该以Buffer来按字节处理。应该这样写:
var titleBuffer = new Iconv('UTF-8', 'GBK').convert('数学'); // 不要toString,直接以字节数组形式存于buffer
然后再自己写一个urlEncode方法,遍历titleBuffer,将url保留字符或非法字符转成url编码。如果不知道怎么写,建议参考ECMA-262文档。
嗯嗯。是滴。我就是后面自己进行url编码的。
var ICVL = require('iconv-lite');
function encodeURIComponent_GBK(str)
{
if(str==null || typeof(str)=='undefined' || str=='')
return '';
var a = str.toString().split('');
for(var i=0; i<a.length; i++) {
var ai = a[i];
if( (ai>='0' && ai<='9') || (ai>='A' && ai<='Z') || (ai>='a' && ai<='z') || ai==='.' || ai==='-' || ai==='_') continue;
var b = ICVL.encode(ai, 'gbk');
var e = ['']; // 注意先放个空字符串,最保证前面有一个%
for(var j = 0; j<b.length; j++)
e.push( b.toString('hex', j, j+1).toUpperCase() );
a[i] = e.join('%');
}
return a.join('');
}
wow,原来iconv-lite里还提供encode(ai, ‘gbk’),这方法可行。
想请问下楼主,我也在弄一个爬虫,你爬回来的html用什么 库 或者 组件 来解析dom? 想找个省力的工具,免得我自己去匹配,要累死人的。
楼主,请问中文参数的问题是怎么解决的,遇到了同样问题解决不了啊
在Node.js中处理GBK和UTF-8之间的转换,并进行URL编码时,可以使用iconv-lite
库来实现字符集的转换,然后再进行URL编码。iconv-lite
库比node-iconv
更常用且功能更强大。下面是解决这个问题的方法:
首先,你需要安装iconv-lite
库:
npm install iconv-lite
接下来是具体的代码示例:
const iconv = require('iconv-lite');
// 转换为GBK,并进行URL编码
function encodeGBKUrl(str) {
const gbkBuffer = iconv.encode(str, 'GBK');
const gbkStr = iconv.decode(gbkBuffer, 'GBK'); // 确保转换后的字符串是GBK编码
return encodeURIComponent(gbkStr);
}
const title = '数学';
const encodedTitle = encodeGBKUrl(title);
console.log(encodedTitle); // 输出: %CA%FD%D1%A7
在这个例子中,我们使用iconv-lite
将UTF-8字符串转换为GBK格式,然后使用encodeURIComponent
函数对结果进行URL编码。
注意:iconv-lite
库能够正确地处理字符集转换,但encodeURI()
或encodeURIComponent()
函数在JavaScript环境中默认处理的是UTF-8编码,而不是GBK。因此,在编码之前确保已经正确地转换为GBK编码是很重要的。