Board logo

标题: [文件操作] 批处理怎样批量将无BOM头UTF-8编码的txt并转成ANSI编码? [打印本页]

作者: zxzl    时间: 2010-6-22 00:17     标题: 批处理怎样批量将无BOM头UTF-8编码的txt并转成ANSI编码?

本帖最后由 pcl_test 于 2018-4-12 14:55 编辑

有一批TXT文件是用软件生成的,都是UTF-8编码,本来想用那个VBS转换脚本把这些UTF-8编码转换成ANSI编码,可是这个VBS脚本却识别不出这是UTF8编码文件,而电脑中手动建立的UTF-8编码TXT文件这个脚本可以正常识别转换,我想可能是软件在生成TXT文件时没有添加UTF-8头,现在假如VBS脚本名为UTF82ANSI.VBS,和所有TXT文件都在同一目录下,那么将所有TXT文件添加UFT-8文件头并转换成ANSI编码的批处理应该怎样写呢?
作者: 73yexs4f8qzk    时间: 2010-6-22 00:25

直接转换成 gbk 编码:
  1. concmd.exe /o:gbk *.txt
复制代码

作者: zqz0012005    时间: 2010-6-22 01:31

“添加UFT-8文件头并转换成ANSI编码”,无需添加BOM照样转换
  1. set fso = CreateObject("Scripting.FileSystemObject")
  2. 'Files属性获取文件集合时,与CMD下的for遍历文件有相同的Bug:
  3. '如果文件名有变动,可能会重复或多次遍历
  4. '看来是某个API的Bug
  5. '所以先获取文件列表再使用保险一点
  6. FileList = ""
  7. for each oFile in fso.GetFolder(".").Files
  8.     if LCase(fso.GetExtensionName(oFile.Path)) = LCase("txt") then
  9.         FileList = FileList & oFile.Path & vbCrLf
  10.     end if
  11. next
  12. Files = Split(FileList, vbCrLf)
  13. for i=0 to UBound(Files)-1 '最后一个元素是空的
  14.     'U8ToU8Bom Files(i) '如果要生成一个有BOM的文件,启用此行
  15.     U8ToAnsi Files(i)
  16. next
  17. function U8ToU8Bom(strFile)
  18.     dim ADOStrm
  19.     Set ADOStrm = CreateObject("ADODB.Stream")
  20.     ADOStrm.Type = 2
  21.     ADOStrm.Mode = 3
  22.     ADOStrm.CharSet = "utf-8"
  23.     ADOStrm.Open
  24.     ADOStrm.LoadFromFile strFile
  25.     ADOStrm.SaveToFile strFile & ".u8.txt", 2
  26.     ADOStrm.Close
  27.     Set ADOStrm = Nothing
  28. end function
  29. function U8ToAnsi(strFile)
  30.     dim ADOStrm
  31.     dim s
  32.     Set ADOStrm = CreateObject("ADODB.Stream")
  33.     ADOStrm.Type = 2
  34.     ADOStrm.Mode = 3
  35.     ADOStrm.CharSet = "utf-8"
  36.     ADOStrm.Open
  37.     ADOStrm.LoadFromFile strFile
  38.     s = ADOStrm.ReadText
  39.     ADOStrm.Position = 0
  40.     ADOStrm.CharSet = "gbk"
  41.     ADOStrm.WriteText s
  42.     ADOStrm.SetEOS
  43.     ADOStrm.SaveToFile strFile & ".ansi.txt", 2
  44.     ADOStrm.Close
  45.     Set ADOStrm = Nothing
  46. end function
复制代码

作者: pdanniel66    时间: 2010-6-22 04:53

回2楼 : concmd 何处下载?
回3楼 : 如何判断文件是 UTF8或 ANSI 编码?
作者: 73yexs4f8qzk    时间: 2010-6-22 08:11

本帖最后由 pcl_test 于 2018-4-12 15:20 编辑
  1. @echo off
  2. powershell ^
  3.     dir . *.txt^|%%{^
  4.         $txt = [IO.File]::ReadAllText($_.FullName, [Text.Encoding]::UTF8);^
  5.         [IO.File]::WriteAllText($_.FullName, $txt ,[Text.Encoding]::Default);^
  6.     }
  7. pause
复制代码

作者: zxzl    时间: 2010-6-22 08:22

感谢 zqz0012005版主提供的VBS脚本,的确可以直接转换成ANSI编码,不过这个脚本是在当前目录直接生成的TXT文件,我想直接将原文件替换成ANSI编码,不知该怎么改一下呢?谢谢了
作者: Batcher    时间: 2010-6-22 09:49

批处理添加UTF-8文件头并转换为ANSI编码
http://bbs.bathome.net/viewthrea ... amp;page=2#pid51589
作者: zxzl    时间: 2010-6-22 10:19

Batcher老大,你说的这个帖子不能实现我想要的功能
作者: Batcher    时间: 2010-6-22 11:32     标题: 回复 8楼 的帖子

具体说说哪里“不能”?
作者: zqz0012005    时间: 2010-6-22 21:00     标题: 回复 6楼 的帖子

& ".ansi.txt"去掉即可。

提示:不管代码可靠性有多高,如果涉及到直接修改原文件,运行代码前先进行备份是中华民族优良传统^_^
作者: sgaizxt001    时间: 2010-6-22 22:14

我感觉好象打开UTF-8的文本,然后另存为ANSI文本就可以了呢?
作者: zxzl    时间: 2010-6-22 22:22

原帖由 sgaizxt001 于 2010-6-22 22:14 发表
我感觉好象打开UTF-8的文本,然后另存为ANSI文本就可以了呢?


呵呵,这样当然可以,不过如果有500个TXT文件你还打算用这种方法吗?
作者: zxzl    时间: 2010-6-22 22:23

原帖由 zqz0012005 于 2010-6-22 21:00 发表
将& ".ansi.txt"去掉即可。

提示:不管代码可靠性有多高,如果涉及到直接修改原文件,运行代码前先进行备份是中华民族优良传统^_^


感谢版主热心回复




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