从找到那天起,一直都很爱EmEditor。轻巧快速,完善的正则表达式和多内码支持。除了编辑超大文件时的表现不如UEdit32外,我几乎找不到别的缺点。而且在没有丢失已有优点的前提下,EmEditor也有在一点点变得更好更强大,是个用起来很窝心的编辑器。
好了,工商时间结束。话说最近一次升级到EmEditor v8后发现,以前的Base64解码插件不能用了。正好现在的EmEditor借助Windows Scripting Host(WSH)提供了宏功能,于是想自己写个解码宏试试感觉。
这个宏需要做的有两件事:一、将Base64字符串解码;二、如需要,进行内码转换。
WSH的标准配备Javascript和VBScript都没有直接提供解决这两件事的函数或对象,也没有所谓标准库一说,要用JS或VBS的话就必须找现成的纯实现或自己写。当然,如果喜欢Perl、PHP、Python、Ruby等等等,WSH其实也能够支持。
这两种法子都不好。Base64肯定有成熟的纯实现,内码转换却是个很复杂的问题,UTF-8至GBK或许OK,Big5至GBK呢?但如果用Ruby一类的语言,写出来的宏就只有自己用了,普通人哪会去装个Ruby解释器?
其实,所谓的“完美”解决办法是有的,而且看起来很简洁,很清晰:
#title = "Base64Decode"
#tooltip = "Decode Selected Base64 String."
function Base64DecodeText(Base64Str, sCharset){
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
var tmpNode = xml_dom.createElement("tmpNode");
tmpNode.dataType = "bin.base64";
tmpNode.text = Base64Str;
var ado_stream = new ActiveXObject("ADODB.Stream");
// Default gb2312
ado_stream.Charset = (typeof(sCharset) == "undefined") ? "gb2312" : sCharset;
ado_stream.Type = 1; // 1=adTypeBinary 2=adTypeText
ado_stream.Open();
ado_stream.Write(tmpNode.nodeTypedValue);
ado_stream.Position = 0;
ado_stream.Type = 2; // 1=adTypeBinary 2=adTypeText
var str = ado_stream.ReadText(-1); // -1=adReadAll
ado_stream.Close();
return str;
}
if (!document.selection.IsEmpty) {
var s = document.selection.Text;
//s = Base64DecodeText(s); // gb2312
s = Base64DecodeText(s, "UTF-8");
OutputBar.Clear();
OutputBar.writeln(s);
OutputBar.Visible = true;
OutputBar.SetFocus();
} else {
alert('Select First!');
}
这一小段东西至少说明了一个问题:那些所谓《YY天精通XX语言》的书,纯属胡扯。
没有评论 :
发表评论