Board logo

标题: [问题求助] VBS如何实现文本不同编码之间互相转换? [打印本页]

作者: xp3000    时间: 2015-6-26 09:58     标题: VBS如何实现文本不同编码之间互相转换?

EPUB电子书导出后是HTML或HTM格式的,附件在下面,
例如改成TXT,从TXT文本里面截取,粘贴进论坛是能换行的,但是记事本查看却不是换行的,换行是个黑的

文件是ANSI格式,需要能互相转换
  1. <h2>《贫女》</h2>
  2.     <p>作者:秦韬玉</p>
  3.     <p>蓬门未识绮罗香,拟托良媒益自伤。</p>
  4.     <p>谁爱风流高格调,共怜时世俭梳妆。</p>
  5.     <p>敢将十指夸针巧,不把双眉斗画长。</p>
  6.     <p>苦恨年年压金线,为他人作嫁衣裳。</p>
  7. </body>
  8. </html>
复制代码
这个是网上找的一个VBS,不能多文件格式转换,而且转换后还是原来样子,黑格子还在,怎么弄成浏览文件夹的?
让VBS选择转换的编码也能按照选项框的数字转换目标?比如
1:目标转换为ANSI
2:目标转换为Unicode
3:目标转换为UTF-8
  1. '用法:将要更改编码的所有文件放到同一个文件夹中,将文件夹拖到该vbs上,输入要转换成的字符编码
  2. Dim fso,fd,fl,f,fdpath,charset
  3. On Error Resume Next
  4. If WScript.Arguments.Length>=1 Then
  5. fdpath = WScript.Arguments(0)
  6. Else
  7. fdpath = InputBox("请输入文件夹路径:" & vbcrlf & "另外一种方法是直接将文件夹拖到VBS文件上","VBS编码转换","D:\TEMP")
  8. If fdpath = "" Then WScript.Quit
  9. End If
  10. If WScript.Arguments.Length>=2 Then
  11. charset = WScript.Arguments(1)
  12. Else
  13. charset = InputBox("请输入字符编码类型:" & vbcrlf & "支持(ANSI、Unicode、UTF-8)转换","转换目标类型(默认值UTF-8可修改)","UTF-8")
  14. if charset = "" then WScript.Quit
  15. if UCase(charset) = "ANSI" then charset = "GB2312"
  16. End If
  17. Set fso = CreateObject("scripting.filesystemobject")
  18. Set fd = fso.GetFolder(fdpath)
  19. Set fl=fd.Files
  20. For each f in fl
  21. convertct f.Path,charset
  22. Next
  23. MsgBox "字符编码转换结束",,"提示"
  24.   
  25. '将读取的文件内容以指定编码写入文件
  26. Function convertct(filepath,charset)
  27. Dim FileName, FileContents, dFileContents
  28. FileName = filepath
  29. FileContents = LoadFile(FileName)
  30. Set savefile = CreateObject("adodb.stream")
  31. savefile.Type = 2  '这里1为二进制,2为文本型
  32. savefile.Mode = 3
  33. savefile.Open()
  34. savefile.charset = charset
  35. savefile.Position = savefile.Size
  36. savefile.Writetext(FileContents)  'write写二进制,writetext写文本型
  37. savefile.SaveToFile filepath,2
  38. savefile.Close()
  39. set savefile = nothing
  40. End Function
  41. '以文件本身编码读取文件
  42. Function LoadFile(Path)
  43.     Dim Stm2
  44.     Set Stm2 = CreateObject("ADODB.Stream")
  45.     Stm2.Type = 2
  46.     Stm2.Mode = 3
  47.     Stm2.Open
  48.     Stm2.Charset = CheckCode(path)
  49.     'Stm2.Charset = "UTF-8"
  50.     'Stm2.Charset = "Unicode"
  51.     'Stm2.Charset = "GB2312"
  52.     Stm2.position = Stm2.Size
  53.     Stm2.LoadFromFile Path
  54.     LoadFile = Stm2.ReadText
  55.     Stm2.Close
  56.     Set Stm2 = Nothing
  57. End Function
  58. '该函数检查并返回文件的编码类型
  59. Function CheckCode(file)
  60. Dim slz
  61. set slz = CreateObject("Adodb.Stream")
  62. slz.Type = 1
  63. slz.Mode = 3
  64. slz.Open
  65. slz.Position = 0
  66. slz.Loadfromfile file
  67. Bin=slz.read(2)
  68. If is_valid_utf8(read(file)) Then
  69. Codes="UTF-8"
  70. ElseIf AscB(MidB(Bin,1,1))=&HFF and AscB(MidB(Bin,2,1))=&HFE Then
  71. Codes="Unicode"
  72. Else
  73. Codes="GB2312"
  74. End if
  75. slz.Close
  76. Set slz = Nothing
  77. CheckCode = Codes
  78. End Function
  79. '将Byte()数组转成String字符串
  80. Function read(path)
  81.     Dim ado, a(), i, n
  82.     Set ado = CreateObject("ADODB.Stream")
  83.     ado.Type = 1 : ado.Open
  84.     ado.LoadFromFile path
  85.     n = ado.Size - 1
  86.     ReDim a(n)
  87.     For i = 0 To n
  88.         a(i) = ChrW(AscB(ado.Read(1)))
  89.     Next
  90.     read = Join(a, "")
  91. End Function
  92. '准确验证文件是否为utf-8(能验证无BOM头的uft-8文件)
  93. Function is_valid_utf8(ByRef input) 'ByRef以提高效率
  94.     Dim s, re
  95.     Set re = New Regexp
  96.     s = "[\xC0-\xDF]([^\x80-\xBF]|$)"
  97.     s = s & "|[\xE0-\xEF].{0,1}([^\x80-\xBF]|$)"
  98.     s = s & "|[\xF0-\xF7].{0,2}([^\x80-\xBF]|$)"
  99.     s = s & "|[\xF8-\xFB].{0,3}([^\x80-\xBF]|$)"
  100.     s = s & "|[\xFC-\xFD].{0,4}([^\x80-\xBF]|$)"
  101.     s = s & "|[\xFE-\xFE].{0,5}([^\x80-\xBF]|$)"
  102.     s = s & "|[\x00-\x7F][\x80-\xBF]"
  103.     s = s & "|[\xC0-\xDF].[\x80-\xBF]"
  104.     s = s & "|[\xE0-\xEF]..[\x80-\xBF]"
  105.     s = s & "|[\xF0-\xF7]...[\x80-\xBF]"
  106.     s = s & "|[\xF8-\xFB]....[\x80-\xBF]"
  107.     s = s & "|[\xFC-\xFD].....[\x80-\xBF]"
  108.     s = s & "|[\xFE-\xFE]......[\x80-\xBF]"
  109.     s = s & "|^[\x80-\xBF]"
  110.     re.Pattern = s
  111.     is_valid_utf8 = (Not re.Test(input))
  112. End Function
复制代码

作者: CrLf    时间: 2015-6-26 15:20

黑格子的问题是文件中换行符单独出现,而非编码原因
作者: xp3000    时间: 2015-6-26 17:34

哦,能不能弄成支持转换多类型文件的?不会哦
作者: yu2n    时间: 2015-6-27 08:04

VBS字符串处理效率低,识别文件编码也不好解决。

concmd - 编码转换工具
http://www.bathome.net/thread-12595-1-1.html

作者: xp3000    时间: 2015-6-28 18:25

其实还有个想法,就是通过几个VBS对比,从中学习些东西




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2