标题: [文件操作] [分享]批处理把UTF-8(有BOM或无BOM)编码文件转换成ANSI编码 [打印本页]
作者: Batcher 时间: 2023-11-9 23:18 标题: [分享]批处理把UTF-8(有BOM或无BOM)编码文件转换成ANSI编码
【问题描述】
C:\Test\U2A 文件夹下有多个txt文件,假设文本内容都是:- bbs.bathome.net
- 批处理之家论坛
- www.bathome.net
复制代码
有一部分txt文件是ANSI编码。
有一部分txt文件是UTF-8编码。
有一部分txt文件是带有BOM的UTF-8编码。
要求全部转换成ANSI编码。
作者: Batcher 时间: 2023-11-9 23:19
【解决方案】
以下代码以ANSI编码保存为 Run.bat 放在 C:\Test\U2A 文件夹下:- @echo off
- cd /d "%~dp0"
- set "FolderStageU=TempUTF8BOM"
- set "FolderOutA=FinalANSI"
- md "%FolderStageU%" 2>nul
- md "%FolderOutA%" 2>nul
- for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
- echo %%a
- for /f "delims=" %%b in ('powershell -f CheckCode.ps1 "%%a"') do (
- if "%%b" == "UTF-8BOM" (
- powershell "[IO.File]::WriteAllLines('%FolderStageU%\%%a',(Get-Content '%%a' -Raw))"
- iconv.exe -f UTF-8 -t GB2312 "%FolderStageU%\%%a" > "%FolderOutA%\%%a" 2>nul
- ) else (
- iconv.exe -f UTF-8 -t GB2312 "%%a" > "%FolderOutA%\%%a" 2>nul
- if errorlevel 1 (
- iconv.exe -t GB2312 "%%a" > "%FolderOutA%\%%a"
- )
- )
- )
- )
复制代码
以下代码以ANSI编码保存为 CheckCode.ps1 放在 C:\Test\U2A 文件夹下:- function Get-FileEncoding {
- [CmdletBinding()]
- param (
- [Parameter(Mandatory = $true)]
- [ValidateScript({ Test-Path $_ })]
- [string]$Path
- )
- $byte = Get-Content -Encoding Byte -ReadCount 2 -TotalCount 2 -Path $Path
- if ($byte[0] -eq 0xEF -and $byte[1] -eq 0xBB) {
- return 'UTF-8BOM'
- } elseif ([System.Text.Encoding]::UTF8.GetString($byte) -match '[^\x00-\x7F]') {
- return 'UTF-8'
- } else {
- return 'ANSI'
- }
- }
- $StrEncode = Get-FileEncoding -Path $Args[0]
- Write-Host "$StrEncode"
复制代码
下载命令行工具 iconv.exe 放在 C:\Test\U2A 文件夹下:
http://bcn.bathome.net/s/tool/index.html?key=iconv
执行 Run.bat 脚本即可。
作者: Five66 时间: 2023-11-10 09:37
啊这,都用上ps了,竟然还调第三方
作者: Batcher 时间: 2023-11-10 09:49
回复 3# Five66
能否把你使用PowerShell脚本完成相同功能的完整代码发出来给大家学习一下?
作者: hnfeng 时间: 2023-11-10 10:13
本帖最后由 hnfeng 于 2023-11-10 10:22 编辑
谢谢分享
但是测试后有个问题:UTF-8_BOM 文件转换后,文件为空,打开后看到文件格式仍然是UTF-8_BOM(为两个字节--当文件内容第一个字符是英文字符时;或4个字节--当文件内容第一个字符是中文字符时)
原本就是ANSI或无BOM的UTF-8文件转换正常
作者: Batcher 时间: 2023-11-10 10:23
回复 5# hnfeng
请把遇到问题的UTF-8_BOM文件上传到网盘,我试试。
作者: hnfeng 时间: 2023-11-10 14:00
回复 6# Batcher
链接:https://pan.baidu.com/s/12IYnQV253r619jymjcGNiQ?pwd=1234
作者: hnfeng 时间: 2023-11-10 14:02
啊这,都用上ps了,竟然还调第三方
Five66 发表于 2023-11-10 09:37
我觉得有时候使用第三方更简单方便
作者: pd1 时间: 2023-11-10 14:44
回复 8# hnfeng
只是需要下载。建议在第三方文件比较小的时候 直接用certutil或者其他方式把文件写到代码里,然后运行的时候直接生成这个第三方程序
作者: pd1 时间: 2023-11-10 14:46
回复 3# Five66
win11试了下,怎么也不行。和gpt还交流了几十个回合,最后的结论是系统默认编码是utf8,让我改注册表。
我让他用c#写,没成功
作者: buyiyang 时间: 2023-11-10 16:38
iconv.exe好像无法识别bom头,我记得went写过一个编解码工具coder.exe,可以自动识别原文件编码- md ansitxt
- for %%i in (*.txt) do coder -c auto ansi -f "%%i">"ansitxt\%%i"
复制代码
作者: pd1 时间: 2023-11-10 17:35
回复 11# buyiyang
win11 Microsoft Windows [版本 10.0.22621.1992]
一样的转完还是utf8
作者: buyiyang 时间: 2023-11-10 18:31
回复 12# pd1
我用win11试了是正常的。你的文本中有中文吗?没有的话记事本可能无法识别是utf8还是ansi
作者: pd1 时间: 2023-11-10 18:36
本帖最后由 pd1 于 2023-11-10 18:38 编辑
回复 13# buyiyang
我用notepad2看的,确实是没有中文,加了个中文可以
作者: pd1 时间: 2023-11-10 18:44
回复 13# buyiyang
如果有中文的话,下面这2个可以转- gc ".\11.txt" -Encoding utf8|sc -Path 22.txt -Encoding Default
复制代码
- gc ".\11.txt" -Encoding utf8|sc -Path 22.txt -Encoding String
复制代码
作者: Five66 时间: 2023-11-10 22:59
回复 4# Batcher
抄了下你的代码和内容、、、
以下代码以ANSI编码保存为 ChangeCoding.ps1 放在 C:\Test\U2A 文件夹下:- $byte =[io.file]::ReadAllBytes($Args[0])
-
- $d=[Text.DecoderReplacementFallback]::new('?')
- $e=[Text.EncoderReplacementFallback]::new('?')
- $cgbk=[text.encoding]::GetEncoding(936,$e,$d)
- $cutf8=[text.encoding]::GetEncoding(65001,$e,$d)
-
- $StrEncode='ANSI'
-
- if($byte.length -le 512){$l=$byte.length} else{$l=512}
- echo "test $l bytes"
-
- if ($byte[0] -eq 0xEF -and $byte[1] -eq 0xBB){
- $StrEncode='UTF-8BOM'
- } else{
- $b=$cgbk.GetBytes($cgbk.GetString($byte,0,$l))
- if($l -eq 512){$l-=16}
- for($i=0;$i -lt $l;$i++){
- if($b[$i] -ne $byte[$i] ){$StrEncode='UTF-8';break}
- }
- }
-
- echo "maybe $StrEncode"
-
- if($StrEncode -eq 'UTF-8BOM'){
- echo "convert $StrEncode to ANSI"
- [io.file]::WriteAllText($Args[1],$cutf8.GetString($byte,3,$byte.length-3),$cgbk)
- }
- if($StrEncode -eq 'UTF-8'){
- echo "convert $StrEncode to ANSI"
- [io.file]::WriteAllText($Args[1],$cutf8.GetString($byte,0,$byte.length),$cgbk)
- }
- if($StrEncode -eq 'ANSI'){}
- echo "`r`n"
复制代码
以下代码以ANSI编码保存为 Run.bat 放在 C:\Test\U2A 文件夹下:
执行 Run.bat 脚本即可。- @echo off
- cd /d "%~dp0"
- set "FolderStageU=TempUTF8BOM"
- set "FolderOutA=FinalANSI"
- md "%FolderStageU%" 2>nul
- md "%FolderOutA%" 2>nul
- for /f "delims=" %%a in ('dir /b /a-d *.txt') do (
- echo %%a
- powershell -ExecutionPolicy bypass -f ChangeCoding.ps1 "%%~fa" "%~dp0%FolderOutA%\%%a"
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |