[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [分享]批处理把UTF-8(有BOM或无BOM)编码文件转换成ANSI编码

【问题描述】

C:\Test\U2A 文件夹下有多个txt文件,假设文本内容都是:
  1. bbs.bathome.net
  2. 批处理之家论坛
  3. www.bathome.net
复制代码
有一部分txt文件是ANSI编码。
有一部分txt文件是UTF-8编码。
有一部分txt文件是带有BOM的UTF-8编码。
要求全部转换成ANSI编码。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

回复 4# Batcher


    抄了下你的代码和内容、、、

以下代码以ANSI编码保存为 ChangeCoding.ps1 放在 C:\Test\U2A 文件夹下:
  1. $byte =[io.file]::ReadAllBytes($Args[0])
  2. $d=[Text.DecoderReplacementFallback]::new('?')
  3. $e=[Text.EncoderReplacementFallback]::new('?')
  4. $cgbk=[text.encoding]::GetEncoding(936,$e,$d)
  5. $cutf8=[text.encoding]::GetEncoding(65001,$e,$d)
  6. $StrEncode='ANSI'
  7. if($byte.length -le 512){$l=$byte.length} else{$l=512}
  8. echo "test $l bytes"
  9. if ($byte[0] -eq 0xEF -and $byte[1] -eq 0xBB){
  10. $StrEncode='UTF-8BOM'
  11. } else{
  12. $b=$cgbk.GetBytes($cgbk.GetString($byte,0,$l))
  13. if($l -eq 512){$l-=16}
  14. for($i=0;$i -lt $l;$i++){
  15. if($b[$i] -ne $byte[$i] ){$StrEncode='UTF-8';break}
  16. }
  17. }
  18. echo "maybe $StrEncode"
  19. if($StrEncode -eq 'UTF-8BOM'){
  20. echo "convert $StrEncode to ANSI"
  21. [io.file]::WriteAllText($Args[1],$cutf8.GetString($byte,3,$byte.length-3),$cgbk)
  22. }
  23. if($StrEncode -eq 'UTF-8'){
  24. echo "convert $StrEncode to ANSI"
  25. [io.file]::WriteAllText($Args[1],$cutf8.GetString($byte,0,$byte.length),$cgbk)
  26. }
  27. if($StrEncode -eq 'ANSI'){}
  28. echo "`r`n"
复制代码
以下代码以ANSI编码保存为 Run.bat 放在 C:\Test\U2A 文件夹下:
执行 Run.bat 脚本即可。
  1. @echo off
  2. cd /d "%~dp0"
  3. set "FolderStageU=TempUTF8BOM"
  4. set "FolderOutA=FinalANSI"
  5. md "%FolderStageU%" 2>nul
  6. md "%FolderOutA%" 2>nul
  7. for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
  8. echo %%a
  9. powershell -ExecutionPolicy bypass -f ChangeCoding.ps1 "%%~fa" "%~dp0%FolderOutA%\%%a"
  10. )
  11. pause
复制代码

TOP

回复 13# buyiyang


    如果有中文的话,下面这2个可以转
  1. gc ".\11.txt" -Encoding utf8|sc -Path 22.txt -Encoding Default
复制代码
  1. gc ".\11.txt" -Encoding utf8|sc -Path 22.txt -Encoding String
复制代码

TOP

本帖最后由 pd1 于 2023-11-10 18:38 编辑

回复 13# buyiyang

我用notepad2看的,确实是没有中文,加了个中文可以


   

TOP

回复 12# pd1

我用win11试了是正常的。你的文本中有中文吗?没有的话记事本可能无法识别是utf8还是ansi

TOP

回复 11# buyiyang


    win11  Microsoft Windows [版本 10.0.22621.1992]
一样的转完还是utf8

TOP

iconv.exe好像无法识别bom头,我记得went写过一个编解码工具coder.exe,可以自动识别原文件编码
  1. md ansitxt
  2. for %%i in (*.txt) do coder -c auto ansi -f "%%i">"ansitxt\%%i"
复制代码

TOP

回复 3# Five66


    win11试了下,怎么也不行。和gpt还交流了几十个回合,最后的结论是系统默认编码是utf8,让我改注册表。
我让他用c#写,没成功

TOP

回复 8# hnfeng


    只是需要下载。建议在第三方文件比较小的时候  直接用certutil或者其他方式把文件写到代码里,然后运行的时候直接生成这个第三方程序

TOP

啊这,都用上ps了,竟然还调第三方
Five66 发表于 2023-11-10 09:37



    我觉得有时候使用第三方更简单方便

TOP

TOP

回复 5# hnfeng


    请把遇到问题的UTF-8_BOM文件上传到网盘,我试试。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 hnfeng 于 2023-11-10 10:22 编辑

谢谢分享

但是测试后有个问题:UTF-8_BOM 文件转换后,文件为空,打开后看到文件格式仍然是UTF-8_BOM(为两个字节--当文件内容第一个字符是英文字符时;或4个字节--当文件内容第一个字符是中文字符时)
原本就是ANSI或无BOM的UTF-8文件转换正常

TOP

回复 3# Five66


    能否把你使用PowerShell脚本完成相同功能的完整代码发出来给大家学习一下?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

啊这,都用上ps了,竟然还调第三方

TOP

返回列表