无忧启动论坛
标题:
UTF8无BOM添加UTF8BOM,UTF8无BOM转ANSI,VBS脚本
[打印本页]
作者:
lintrainwy
时间:
2016-12-18 22:07
标题:
UTF8无BOM添加UTF8BOM,UTF8无BOM转ANSI,VBS脚本
本帖最后由 comzhongwy 于 2016-12-21 15:28 编辑
想用bat+vbs读取C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk,但是它是UTF-8无BOM的,不能直接用,试了好多次终于搞定了,记录一下。
UTF8无BOM添加UTF8BOM.vbs
Dim Stream,ObjXML,MyNode,BufferData,sHEX,BinaryData
Set Stream = CreateObject("ADODB.Stream")
Set ObjXML = CreateObject("Microsoft.XMLDOM")
Set MyNode = ObjXML.CreateElement("binary")
Stream.Type = 1
MyNode.DataType = "bin.hex"
Stream.Open
Stream.LoadFromFile "1.pbk"
MyNode.NodeTypedValue = Stream.Read
Stream.Close
BinaryData = MyNode.Text
Stream.Open
MyNode.Text = Replace(LCase("EF BB BF" & BinaryData), " ", "")
Stream.Write MyNode.NodeTypedValue
Stream.SaveToFile "1.txt", 2
Stream.Close
Set stream = Nothing
Set ObjXML = Nothing
Set MyNode = Nothing
Wscript.Quit(0)
复制代码
UTF8无BOM转ANSI.vbs
Dim Stream,ObjXML,MyNode,BufferData,sHEX,BinaryData
Set Stream=CreateObject("ADODB.Stream")
Set ObjXML=CreateObject("Microsoft.XMLDOM")
Set MyNode=ObjXML.CreateElement("binary")
Stream.Type=1
Stream.Open
Stream.LoadFromFile "C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk"
MyNode.DataType="bin.hex"
MyNode.NodeTypedValue=Stream.Read
MyNode.Text=Replace(LCase("EF BB BF" & MyNode.Text),"","")
Stream.Close
Stream.Open
Stream.Write MyNode.NodeTypedValue
Stream.SaveToFile "a.txt",2
Stream.Close
Stream.Type=2
Stream.mode=3
Stream.charset="UTF-8"
Stream.Open
Stream.loadfromfile "a.txt"
Str=Stream.readtext
Stream.Close
Stream.charset="GB2312"
Stream.Open
Stream.WriteText Str
Stream.SaveToFile "a.txt",2
Stream.flush
Stream.Close
Set stream=Nothing
Set ObjXML=Nothing
Set MyNode=Nothing
Wscript.Quit(0)
复制代码
作者:
红毛樱木
时间:
2016-12-18 22:17
请教有无BOM到底啥区别?
作者:
2010nmb
时间:
2016-12-18 22:26
UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。
所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。
BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。
其实说BOM是个坏习惯也不尽然。BOM也是Unicode标准的一部分,有它特定的适用范围。通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8,UTF-16BE,UTF-16LE)。Windows相对对BOM处理比较好,是因为Windows把Unicode识别代码集成进了API里,主要是CreateFile()。打开文本文件时它会自动识别并剔除BOM。Windows用这个有历史原因,因为它最初脱胎于多代码页的环境(ANSI环境)。而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同时兼容Unicode和非Unicode(Multiple byte)文本文件,就只能借助这种小trick了。相比之下,Linux这样的系统在多locale的环境中浸染的时间比较短,再加上社区本身也有足够的动力轻装前进(吐槽:微软对兼容性的要求确实是到了非常偏执的地步,任何一点破坏兼容性的做法都不允许,以至于很多时候是自己绑住自己的双手),所以干脆一步到位进入UTF-8。当然中间其实有一段过渡期,比如从最初全UTF-8的GTK+2.0发布到基本上所有GTK开发者都弃用多locale的GTK+1.2,我印象中至少经历了三到四年。
BOM不受欢迎主要是在UNIX环境下,因为很多UNIX程序不鸟BOM。主要问题出在UNIX那个所有脚本语言通行的首行#!标示,这东西依赖于shell解析,而很多shell出于兼容的考虑不检测BOM,所以加进BOM时shell会把它解释为某个普通字符输入导致破坏#!标示,这就麻烦了。其实很多现代脚本语言,比如Python,其解释器本身都是能处理BOM的,但是shell卡在这里,没办法,只能躺着也中枪。说起来这也不能怪shell,因为BOM本身违反了一个UNIX设计的常见原则,就是文档中存在的数据必须可见。BOM不能作为可见字符被文本编辑器编辑,就这一条很多UNIX开发者就不满意。
顺便说一句,即使脚本语言能处理BOM,随处使用BOM也不是推荐的办法。各个脚本语言对Unicode的处理都有自己的一套,Python的 # -*- coding: utf-8 -*-,Perl的use utf8,都比BOM简单而且可靠。另一个好消息是,即使是必须在Windows和UNIX之间切换的朋友也不会悲催。幸亏在UNIX环境下我们还有VIM这种神器,即使遇到BOM挡道,我们也可以通过 set nobomb; set fileencoding=utf8; w 三条命令解决问题。
最后回头想想,似乎也真就只有Windows坚持用BOM了。
作者:
窄口牛
时间:
2016-12-19 08:25
反过来呢?utf8转成ansi,批处理修改完,再转回utf8呢?
作者:
lintrainwy
时间:
2016-12-19 10:11
窄口牛 发表于 2016-12-19 08:25
反过来呢?utf8转成ansi,批处理修改完,再转回utf8呢?
代码不算复杂,流程倒过来改改就是,或者封装成函数也可以
作者:
Superxiaokui
时间:
2017-3-30 16:00
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hong645
时间:
2017-4-3 22:44
多谢楼主
欢迎光临 无忧启动论坛 (http://wuyou.net/)
Powered by Discuz! X3.3