无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 2990|回复: 6
打印 上一主题 下一主题

[原创] UTF8无BOM添加UTF8BOM,UTF8无BOM转ANSI,VBS脚本

  [复制链接]
跳转到指定楼层
1#
发表于 2016-12-18 22:07:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 comzhongwy 于 2016-12-21 15:28 编辑

想用bat+vbs读取C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk,但是它是UTF-8无BOM的,不能直接用,试了好多次终于搞定了,记录一下。

UTF8无BOM添加UTF8BOM.vbs
  1. Dim Stream,ObjXML,MyNode,BufferData,sHEX,BinaryData

  2. Set Stream = CreateObject("ADODB.Stream")
  3. Set ObjXML = CreateObject("Microsoft.XMLDOM")
  4. Set MyNode = ObjXML.CreateElement("binary")

  5. Stream.Type = 1  
  6. MyNode.DataType = "bin.hex"
  7.   
  8. Stream.Open
  9. Stream.LoadFromFile "1.pbk"
  10. MyNode.NodeTypedValue = Stream.Read
  11. Stream.Close
  12. BinaryData = MyNode.Text  
  13.   
  14. Stream.Open
  15. MyNode.Text = Replace(LCase("EF BB BF" & BinaryData), " ", "")
  16. Stream.Write MyNode.NodeTypedValue  
  17. Stream.SaveToFile "1.txt", 2
  18. Stream.Close

  19. Set stream = Nothing
  20. Set ObjXML = Nothing
  21. Set MyNode = Nothing
  22. Wscript.Quit(0)
复制代码


UTF8无BOM转ANSI.vbs
  1. Dim Stream,ObjXML,MyNode,BufferData,sHEX,BinaryData

  2. Set Stream=CreateObject("ADODB.Stream")
  3. Set ObjXML=CreateObject("Microsoft.XMLDOM")
  4. Set MyNode=ObjXML.CreateElement("binary")

  5. Stream.Type=1
  6. Stream.Open
  7. Stream.LoadFromFile "C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk"
  8. MyNode.DataType="bin.hex"
  9. MyNode.NodeTypedValue=Stream.Read
  10. MyNode.Text=Replace(LCase("EF BB BF" & MyNode.Text),"","")
  11. Stream.Close

  12. Stream.Open
  13. Stream.Write MyNode.NodeTypedValue
  14. Stream.SaveToFile "a.txt",2
  15. Stream.Close

  16. Stream.Type=2
  17. Stream.mode=3
  18. Stream.charset="UTF-8"
  19. Stream.Open
  20. Stream.loadfromfile "a.txt"
  21. Str=Stream.readtext
  22. Stream.Close

  23. Stream.charset="GB2312"
  24. Stream.Open
  25. Stream.WriteText Str
  26. Stream.SaveToFile "a.txt",2
  27. Stream.flush
  28. Stream.Close

  29. Set stream=Nothing
  30. Set ObjXML=Nothing
  31. Set MyNode=Nothing
  32. Wscript.Quit(0)
复制代码
推荐
发表于 2016-12-18 22:26:49 | 只看该作者
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了。
回复

使用道具 举报

2#
发表于 2016-12-18 22:17:51 | 只看该作者
请教有无BOM到底啥区别?
回复

使用道具 举报

4#
发表于 2016-12-19 08:25:21 来自手机 | 只看该作者
反过来呢?utf8转成ansi,批处理修改完,再转回utf8呢?

点评

代码不算复杂,流程倒过来改改就是,或者封装成函数也可以  详情 回复 发表于 2016-12-19 10:11
回复

使用道具 举报

5#
 楼主| 发表于 2016-12-19 10:11:22 来自手机 | 只看该作者
窄口牛 发表于 2016-12-19 08:25
反过来呢?utf8转成ansi,批处理修改完,再转回utf8呢?

代码不算复杂,流程倒过来改改就是,或者封装成函数也可以
回复

使用道具 举报

6#
发表于 2017-3-30 16:00:57 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

7#
发表于 2017-4-3 22:44:42 | 只看该作者
多谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-28 02:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表