标题: [问题求助] PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招 [打印本页]
作者: 5i365 时间: 2022-2-20 19:45 标题: PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招
用下面的代码, 可以将当前文件夹下的txt文件的编码转为UTF8, 第一次执行后, 所有的文本, 不管理ansi编码还是utf8-bom的, 都会变成utf8, 但再次执行此脚本, 所有的文本文件中的中文全部变成了乱码, 苦乱码久矣, 请高手支招! 多谢!
请随便建几个txt文本文件测试, 不要使用自己有用的txt文件测试- foreach ($F in gci *.txt)
- {
- $C = Get-Content $F
- [IO.File]::WriteAllLines($F, $C);
- }
复制代码
作者: for_flr 时间: 2022-2-21 17:15
再次运行代码的时候,get-content到的就已经是乱码了,因为get-content默认的ansi。
改一改went大神给你的编码函数那个帖子,应该可以解决你的问题。
作者: idwma 时间: 2022-2-21 17:26
回复 2# for_flr
4行写入的文件是没有bom的,识别没有bom头的文件编码有点难度
作者: 5i365 时间: 2022-2-21 19:12
回复 2# for_flr
感谢两位大佬指引, 不管原文件是什么编码, 第一次转后, 肯定会变成 UTF8, 只要加个判断 是UTF8 跳过就行了
作者: 5i365 时间: 2022-2-21 19:14
本帖最后由 5i365 于 2022-2-21 19:15 编辑
回复 3# idwma
感谢提醒, 其实以前went大佬就给过代码了, 但是我感觉太长了, 要是能加个小判断, 不是UTF8 就跳过就好了, 因为 不管原文件是什么编码, 第一次转后, 肯定会变成 UTF8
http://www.bathome.net/redirect. ... 1288&pid=250426
作者: idwma 时间: 2022-2-21 20:31
本帖最后由 idwma 于 2022-2-21 20:33 编辑
回复 5# 5i365 - foreach ($F in gci *.txt)
- {
- $C=gc $F
- $b=(gc -enc byte $F)
- foreach($i in $b){
- if($i -gt 127 -and $i -ne 10 -and $i -ne 13){$d+=0.5}elseif($i -ne 10 -and $i -ne 13){$d++}
- }
- if((-join $C).length -eq $d){
- [IO.File]::WriteAllLines($F, $C);
- }
- rv d,i
- }
复制代码
作者: 5i365 时间: 2022-2-21 21:04
回复 6# idwma
现在我的WIN7系统就差个下面这个计划任务代码了, 每隔五分钟就执行一下上面的转码, 但是突然感觉可能会有意外发生, 比如, 我还没有拷过去, 正好到5分钟了, 那岂不出错?
http://www.bathome.net/thread-61669-1-1.html
作者: 5i365 时间: 2022-3-17 15:49
本帖最后由 5i365 于 2022-3-17 17:27 编辑
回复 6# idwma
大侠, 能否根据这个代码改进一下?
http://www.bathome.net/redirect. ... 1964&pid=252802
这是我稍微精简了下zaqmlp 大侠的代码- gci *.bat |
- foreach{
- $text = [IO.File]::ReadAllBytes($_.FullName)
- if (($text.Count -gt 3) -and ($text[0] -eq '239') -and ($text[1] -eq '187') -and ($text[2] -eq '191'))
- {
- $s = $text[3 .. ($text.Count - 1)]
- [IO.File]::WriteAllBytes($_.FullName, $s);
- }
- }
复制代码
作者: idwma 时间: 2022-3-17 17:05
回复 8# 5i365
看不见z大的代码
这个就挻好的完美
作者: 5i365 时间: 2022-3-17 17:29
回复 9# idwma
哦, 刚刚看了一下,确实锁了,
zaqmlp 大侠, 抱歉, 晚辈我上楼忘加上引用您的代码了, 已经加上
_________________________________________________________
这个代码, 按发贴的要求,应该是识别带BOM的UTF8, 好像没有识别ANSI, 不太懂那里的数字是怎么得出来的, 所以就想问问您
作者: idwma 时间: 2022-3-17 17:44
本帖最后由 idwma 于 2022-3-17 18:04 编辑
回复 10# 5i365
这些数字是文件前3个字节的值
你看看bom utf8文件前3个字节的值是不是这3个数
作者: 5i365 时间: 2022-3-17 17:57
回复 11# idwma
怎么看字节的数字? 对这个一直不懂
作者: idwma 时间: 2022-3-17 18:05
回复 12# 5i365
代码里不是有吗?
$text[0]这是几?
作者: 5i365 时间: 2022-3-17 18:09
回复 13# idwma
多谢大侠指教, 貌似明白了, 我找几个不同编码的文件, 然后看看他们的前几个字符呗
作者: 5i365 时间: 2022-3-20 15:37
本帖最后由 5i365 于 2022-3-20 16:02 编辑
回复 13# idwma
有更简单的办法,这个组件可以一条代码验证编码格式, 用这个组件的好处, 它是跨平台的, 我在苹果系统下, 用powershell 也能用这个组件!
https://www.chilkatsoft.com/refdoc/csCharsetRef.html#method29
______________________________________________________________
Add-Type -Path "C:\chilkat\ChilkatDotNet48.dll"
(New-Object Chilkat.Charset).VerifyFile("ansi", "test.txt")
将文件夹下所有的UTF8-bom文本文件转为UTF8文件
- Add-Type -Path "C:\chilkat\ChilkatDotNet48.dll"; $charset = New-Object Chilkat.Charset
- gci *.txt |
- foreach{
- if ($charset.VerifyFile("bom-utf-8", $_.FullName))
- {
- [IO.File]::WriteAllBytes($_.FullName, (gc -enc UTF8 $_.FullName))
- }
- }
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |