Board logo

标题: [文本处理] 批处理替换字符时,中文乱码怎么办 [打印本页]

作者: cktest0001    时间: 2013-9-30 12:26     标题: 批处理替换字符时,中文乱码怎么办

刚才求得了批处理的方法,非常感谢大家。原帖地址:http://www.bathome.net/thread-26646-1-1.html
这里再把需求重复一遍:

有一个文件叫 替换内容集.txt ,里面的内容是:
苹果,apple
橘子,orange
香蕉,banana
……

有一个文件夹,下面有很多文件,也有子文件夹,子子文件夹。
现在要遍历这个文件夹下面的所有文件(包括子文件夹中的),将文件中的苹果、橘子、香蕉等等,替换成apple、orange、…………

上面这个需求已经写好了。现在遇到的问题是,如果替换内容是英文,那没问题,如果是中文,就乱码了

三种文件都是"以 UTF-8 无 BOM 格式编码"。
求大神帮忙。
作者: cktest0001    时间: 2013-9-30 12:28

替换之后,英文正常,中文变乱码
作者: DAIC    时间: 2013-9-30 13:32

先把文件编码转换成ANSI
作者: cktest0001    时间: 2013-9-30 13:41

回复 3# DAIC


    不行啊,一转换,目标文件里的中文全变乱码了。
作者: cktest0001    时间: 2013-9-30 13:59

没人知道么? :'( :'( :'(
作者: cktest0001    时间: 2013-9-30 14:16

紧急求助呐~~~一万多个文件呢,不可能手动一个个去改编码格式啊
作者: cktest0001    时间: 2013-9-30 14:55

难道真的没法处理uft-8 ??
作者: cktest0001    时间: 2013-9-30 15:44

再顶顶,实在是没辙了!!!
作者: DAIC    时间: 2013-9-30 16:18

回复 4# cktest0001


你是如何转换的?
你使用的是英文系统吗?
作者: DAIC    时间: 2013-9-30 16:18

回复 6# cktest0001


可以用脚本来批量转换
http://www.bathome.net/thread-3900-1-1.html
作者: cktest0001    时间: 2013-9-30 16:27

回复 10# DAIC


    我的文件都是"以 UTF-8 无 BOM 格式编码"这个格式的,用你的会有异常呐~~
作者: cktest0001    时间: 2013-9-30 16:29

回复 9# DAIC


    windows8,中文系统。
    文件没有做转换,也不能转换,一万多个呢。
    现在的问题就是执行上面的脚本无法替换,因为文件的编码不一样,字符匹配不上。
作者: DAIC    时间: 2013-9-30 16:45

回复 11# cktest0001


    你用的哪个代码?U82GB.vbs是这个吗?报错信息是什么?
作者: DAIC    时间: 2013-9-30 16:50

回复 12# cktest0001


如果10楼的U82GB.vbs不行,那就试试这个:
http://www.bathome.net/viewthread.php?tid=10300#pid66972

只要能找到合适你的转换脚本,别说一万个了,就是十万个也能很快搞定。
作者: cktest0001    时间: 2013-9-30 16:58

回复 14# DAIC


    谢谢,我还决定放弃windows了,去Linux下用shell算了。
作者: DAIC    时间: 2013-9-30 17:23

回复 15# cktest0001


    喜闻乐见!有Linux多方便啊,到Windows下面瞎折腾啥。
作者: PowerShell    时间: 2013-9-30 18:37

powershell交流宗宗主,我来也~~
谁敢说linux强win不行?尤其是说win8不行?!滚粗~~~~
详细说出你的需求,我来给你写脚本。
作者: PowerShell    时间: 2013-9-30 20:09

http://www.bathome.net/thread-25683-1-3.html  powershell中有世界上最好的编码处理技术
作者: cktest0001    时间: 2013-9-30 23:08

回复 17# PowerShell


    版主能解决我这个贴里的问题不?
    代码和需求都已经写在一楼了。
    遇到的问题就是编码不一致,目标文件是“以 UTF-8 无 BOM 格式编码”,并且有一万多个。
    用一楼的bat脚本替换后,中文变成了乱码。。。。
作者: apang    时间: 2013-10-1 10:42

本帖最后由 apang 于 2013-10-1 21:26 编辑

保存为test.vbs,与"替换内容集.txt"存放在同一位置(替换内容集.txt必须是ansi编码),试试
  1. On Error Resume Next
  2. SrcDir = Left(WScript.ScriptFullName,InstrRev(WScript.ScriptFullName,"\")-1)
  3. ListFile = SrcDir & "\替换内容集.txt"
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Set objFile = fso.OpenTextFile(ListFile,1)
  6. Do Until objFile.AtEndofStream
  7.     strLine = objFile.ReadLine
  8.     If InStr(strLine,",") Then
  9.         ReDim PreServe ar(1,i)
  10.         ar(0,i)=Split(strLine,",")(0) : ar(1,i)=Split(strLine,",")(1)
  11.         i = i + 1
  12.     End If
  13. Loop
  14. GetSubFolder SrcDir
  15. Sub GetSubFolder(SubFolder)
  16.     For Each file in fso.GetFolder(SubFolder).Files
  17.         If LCase(Right(file,4)) = ".txt" Then
  18.             If Not LCase(file) = LCase(ListFile) Then
  19.                 WriteToFile file,"UTF-8"
  20.             End If
  21.         End If
  22.     Next
  23.     For Each folder in fso.GetFolder(SubFolder).SubFolders
  24.         GetSubFolder folder
  25.     Next
  26. End Sub
  27. Sub WriteToFile(file,CharSet)
  28.     With CreateObject("Adodb.Stream")
  29.         .Type = 2
  30.         .Mode = 3
  31.         .CharSet = CharSet
  32.         .Open
  33.         .LoadFromFile file
  34.         text = .Readtext
  35.         For j = 0 to i - 1
  36.             text = RePlace(text,ar(0,j),ar(1,j))
  37.         Next
  38.         .Position = 0
  39.         .CharSet = CharSet
  40.         .WriteText text
  41.         .SetEOS
  42.         .SaveToFile file,2
  43.         .Close
  44.     End With
  45. End Sub
复制代码
受刺激了,还是改一下。。。
作者: PowerShell    时间: 2013-10-1 18:49

1 由于你没有提供测试文件,所以也没法测试,总之这是试用版,搞坏你数据概不负责,你自己做好备份。(脚本我简单跑了下,没啥问题)
2 for坛友cktest00012.ps1          下载。ps1 脚本,并把前面的变量改成你真实的环境,保存。
3 管理员cmd运行下列命令:
rem 用管理员权限的cmd命令行中,运行下列命令,开启powershell的.ps1脚本运行权限:
"C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy  bypass"
"C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy  bypass"
4 开启powershell。exe ,打入 cd  你脚本保存的目录。然后打for,然后按tab,即可出现 for坛友cktest00012.ps1 敲回车即可。

5 我想说这题很难,难在性能,理由如下:
5.1 很明显打开一个文件,然后遍历【替换内容集】中的条目,然后替换,性能高。而对一对替换内容,遍历文件,性能低。
5.2 我不知道bat sed等能否一次【在内存中!】替换多个内容。如果不能,就是替换一次,保存一遍,虽然有操作系统缓存会加快很多速度。但也不如直接在内存中遍历替换内容集性能高。尤其是【替换内容集】中的条目比较多的时候。
5.3 我这个脚本很明确是在内存中操作。尤其是【替换内容集】中的条目比较多的时候。我认为我的脚本性能最好,而且我这脚本还能性能优化。欢迎脚本pk呀。

6 过节了,总要休息,甚至杂事纷呈,没空泡坛子了,回复不及时莫怪。
作者: Hello123World    时间: 2021-12-7 11:45

回复 4# cktest0001


    下载软件Notepad++,打开Notepad++,编码-转为ANSI编码
作者: WHY    时间: 2021-12-7 22:42

我认为我的脚本性能最好,而且我这脚本还能性能优化。欢迎脚本pk呀。

我也认为我的脚本天下第一。问:天下第一的脚本长啥样?答:天热蚊子多,我想想先。

相声 小品 魔术杂技
评书 笑话 说唱艺术
东西南北中
君请看 曲苑杂坛




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