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都可以正常的识别保存使用