用了node-iconv库,把UTF-8转换成GBK,然后在encodeURI();但是发现没有真正的转成功。
测试代码
var title = new Iconv('UTF-8', 'GBK').convert('数学').toString();
console.log(encodeURI(title) == '%CA%FD%D1%A7');
请问各位有什么方法,或者是哪个库可以这样转吗?
14 回复
其实是没有问题的,我请求的网页返回的内容也是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文档。
var reqBook = http.request(options, function(res) {
res.setEncoding('binary');
res.on('data', function (chunk) {
html += chunk;
});
res.on('end',function(){
html = new Iconv('GBK','UTF-8').convert(new Buffer(html,'binary')).toString();
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('');
}