window javascript+fso+ado 读取/判断/转换编码方法

function file2bin(path) {
	var fso = new ActiveXObject("Scripting.FileSystemObject");

    if (!fso.FileExists(path)) {
        alert('文件不存在:' + path);
        return null;
    }
    
    var ado = new ActiveXObject('ADODB.Stream');
    var adReadAll  = -1;
    var adTypeBinary = 1;
var adModeReadWrite  = 3;
var adTypeText  = 2;
ado.mode = adModeReadWrite 
    ado.Open();   
 ado.Type = adTypeBinary;
    ado.LoadFromFile(path);


    ado.Position = 0;
ado.Type = adTypeText ;
ado.charset="437";//此编码相当16进制

var charset = 'iso-8859-1';//系统默认编码

    var bom = escape(ado.ReadText(10)); 
var charsets = {//此编码名为window的记事本打开的编码名
'UNICODE' :'%A0%u25A0' //notepad2编码utf-16 le bom,win hex前n字节 FF FE
,'UTF-8':'%u2229%u2557%u2510' //notepad2编码utf-8 signature,win hex前n字节 EF BB BF

,'UNICODE big endian':'%u25A0%A0' //notepad2编码utf-16 be bom,win hex前n字节 FE FF
};








for (var c in charsets) {
  if (bom.indexOf(charsets[c]) == 0) {
 charset = c;
break;
}
}
prompt('取前n字节转义如下,判断为编码:' +charset,bom  );
   ado.Position = 0; 
ado.Charset = charset ;

bin = ado.readText(adReadAll  );

    ado.Close();
    return (bin);
}

(file2bin(_('zipCssPath').value));


把测试代码保存成hta后缀即可测试,

原理是根据保存文件放置在文件流前的几个字节来进行,但是有些编码并没有放置此标志位,所以,无法判断.然后至于文本工具如何判断就不太清楚了.


ado的读取方式是因为cp437编码与ASCII有些相似,所以可以活用在这里来判断.



<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>css预处理工具-- by qidizi</title>
</head>
<body>

<h1>discuz的css预处理工具</h1>
<fieldset>
	<legend>
		把discuz的data\cache\style_xxID_module.css分割成对应的css文件
	</legend>
	<div>
		<p>因为discuz的css使用动态生成替换变量的方式来处理,如果缓存时间过短,就会导航样式加载不上,可以使用此工具分割,修改css加载方式即可</p>
		选择要处理的style_xxID_module.css缓存文件 <input type="file" id="modulePath" /><br/>
		<input type="button" id="doModule" value="开始处理" />
	</div>
</fieldset>


<fieldset>
	<legend>
		css格式化(方便人眼看)
	</legend>
	<div>
		<p>
			
		</p>
		选择要处理的文件 <input type="file" id="formatCssPath" /><br/>
		<input type="button" id="doFormatCss" value="开始处理" />
	</div>
</fieldset>


<fieldset>
	<legend>
		css压缩(移除注释空格之类,减少加载时间)
	</legend>
	<div>
		<p>
			
		</p>
		选择要处理的文件 <input type="file" id="zipCssPath" /><br/>
		<input type="button" id="doZipCss" value="开始处理" />
	</div>
</fieldset>

<script>
var fso = new ActiveXObject("Scripting.FileSystemObject");

function _(id){
	return document.getElementById(id);
}	

_('doModule').onclick = function(){
	var mp = _('modulePath').value;
	
	if (/^\s*$/.test(mp)) {
		return alert('请选择要处理的module的缓存文件');
	}
	
	if (!fso.FileExists(mp)) {
		return alert('文件不存在:' + mp);
	}
	
	var ForAppending = 8;
	var utf8 = true;
	var create = true;
	var ForReading = 1;
	if (!fso.getFile(mp).size) return alert('文件是空的,不必处理:' +mp);
	var css = readFile(mp);
	var saveDir = fso.GetParentFolderName(mp) + '\\qidiziSplit';
	
	if (fso.FolderExists(saveDir)) {
		var ok = confirm('用于保存分割后的文件的目录已经存在,为了不跟已有的文件混合,请删除此目录再继续?\n' + saveDir);
		
		if (!ok) return;
		try {
			fso.deleteFolder(saveDir);
			var delay = 100000;
			while(delay-- > 0);//延时,防止没删除完成占用
		} catch (e) {
			return alert('删除目录:' + saveDir + '失败:' + e.description+ ';请手工删除再继续.');
		}
	}
	
	saveDir += '\\';
	fso.CreateFolder(saveDir);
	var cssSplit = css.split('[end]');

	for (var i = 0; i < cssSplit.length; i++) {
		var cssSource = '';
		var files = 0;
		var cp = cssSplit[i].replace(/\[([^\[\]]+)\]/g, function($0, $1){
			files = $1.replace(/\:\:/g, '_').toString().split(',');
			return '';
		});
		
		if (!files) continue;
		cp = cp.replace(/\s/g, '').toString().replace(/\}/g, '}\n');
		
		for (var ii = 0; ii < files.length; ii++) {
			var savePath = saveDir + files[ii] + '.css';			
			saveFile(savePath, cp);
		}
	}
	
	alert('处理完成,保存文件目录是:' + saveDir);
	new ActiveXObject('WScript.Shell').exec('explorer.exe "' +saveDir+ '"');
};

_('doFormatCss').onclick = function(){
	var mp = _('formatCssPath').value;
	
	if (/^\s*$/.test(mp)) {
		return alert('请选择要处理文件');
	}
	
	if (!fso.FileExists(mp)) {
		return alert('文件不存在:' + mp);
	}
	
	var ForWrite = 2;
	var utf8 = true;
	var create = true;
	var ForReading = 1;
	if (!fso.getFile(mp).size) return alert('文件是空的,不必处理:' +mp);
	var css = readFile(mp);
	css = css.replace(/\s/g, '').toString().replace(/\}/g, '}\n');			
	saveFile(mp, css);
	alert('处理完成' + mp);
	new ActiveXObject('WScript.Shell').exec('explorer.exe "' +mp+ '"');
};

_('doZipCss').onclick = function(){
	var mp = _('zipCssPath').value;
	
	if (/^\s*$/.test(mp)) {
		return alert('请选择要处理文件');
	}
	
	if (!fso.FileExists(mp)) {
		return alert('文件不存在:' + mp);
	}
	
	var ForWrite = 2;
	var utf8 = true;
	var create = true;
	var ForReading = 1;
	if (!fso.getFile(mp).size) return alert('文件是空的,不必处理:' +mp);
	var css = readFile(mp);
	css = css.replace(/\s/g, '').toString().replace(/\/\*[\s\S]*?\*\//g, '');
	saveFile(mp, css);
	alert('处理完成' + mp);
	new ActiveXObject('WScript.Shell').exec('explorer.exe "' +mp+ '"');
};

function readFile(path) {
    if (!fso.FileExists(path)) {
        alert('文件不存在:' + path);
        return null;
    }
    
    var ado = new ActiveXObject('ADODB.Stream');
    var adReadAll  = -1;
    var adTypeBinary = 1;
	var adModeReadWrite  = 3;
	var adTypeText  = 2;
	ado.mode = adModeReadWrite 
    ado.Open();   
	ado.Type = adTypeBinary;
    ado.LoadFromFile(path);
    ado.Position = 0;
	ado.Type = adTypeText ;
	ado.charset="437";//此编码相当16进制
	var charset = 'iso-8859-1';//系统默认编码
    var bom = escape(ado.ReadText(10));//应该4字节就足够
	var charsets = {//此编码名为window的记事本打开的编码名
		'UNICODE' :'%A0%u25A0' //notepad2编码utf-16 le bom,win hex前n字节 FF FE
		,'UTF-8':'%u2229%u2557%u2510' //notepad2编码utf-8 signature,win hex前n字节 EF BB BF
		,'UTF-16':'%u25A0%A0' //notepad2编码utf-16 be bom,win hex前n字节 FE FF notepad是UNICODE big endian
	};

	for (var c in charsets) {
		if (bom.indexOf(charsets[c]) == 0) {
			charset = c;
			break;
		}
	}
	
	//prompt('取前n字节转义如下,判断为编码:' +charset,bom  );
	ado.Position = 0; //重置指标
	ado.Charset = charset ;//设置源文件的真实编码
	var text = ado.readText(adReadAll);//读取全部内容
    ado.Close();
    return text;
}

function saveFile(path, text, addend) {//以utf-8编码保存
	if (!path) return alert('路径不能为空');
	var oldText = '';
	
	if (addend && fso.fileExists(path)) {
		oldText = readFile(path);
	}
	
	var ForWrite = 2;
	var create = true;
	var utf8 = false;
	var fp = fso.OpenTextFile(path, ForWrite, create, utf8);
	fp.write(oldText + text);
	fp.close();	
}
</script>

</body>
</html>

xxx.hta 用于处理css文件,经过测试,在源css文件中输入中文,使用window的notepad保存ansi/utf-8/unicode/big都可以正常的识别保存使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值