Board logo

标题: [问题求助] PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招 [打印本页]

作者: 5i365    时间: 2022-2-20 19:45     标题: PowerShell把txt文件的编码转为UTF8乱码问题, 请高手支招

用下面的代码, 可以将当前文件夹下的txt文件的编码转为UTF8, 第一次执行后, 所有的文本, 不管理ansi编码还是utf8-bom的, 都会变成utf8, 但再次执行此脚本, 所有的文本文件中的中文全部变成了乱码, 苦乱码久矣, 请高手支招! 多谢!
请随便建几个txt文本文件测试, 不要使用自己有用的txt文件测试
  1. foreach ($F in gci *.txt)
  2. {
  3. $C = Get-Content $F
  4. [IO.File]::WriteAllLines($F, $C);
  5. }
复制代码

作者: 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
  1. foreach ($F in gci *.txt)
  2. {
  3. $C=gc $F
  4. $b=(gc -enc byte $F)
  5. foreach($i in $b){
  6. if($i -gt 127 -and $i -ne 10 -and $i -ne 13){$d+=0.5}elseif($i -ne 10 -and $i -ne 13){$d++}
  7. }
  8. if((-join $C).length -eq $d){
  9. [IO.File]::WriteAllLines($F, $C);
  10. }
  11. rv d,i
  12. }
复制代码

作者: 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 大侠的代码
  1. gci *.bat |
  2. foreach{
  3. $text = [IO.File]::ReadAllBytes($_.FullName)
  4. if (($text.Count -gt 3) -and ($text[0] -eq '239') -and ($text[1] -eq '187') -and ($text[2] -eq '191'))
  5. {
  6. $s = $text[3 .. ($text.Count - 1)]
  7. [IO.File]::WriteAllBytes($_.FullName, $s);
  8. }
  9. }
复制代码

作者: 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文件

  1. Add-Type -Path "C:\chilkat\ChilkatDotNet48.dll"; $charset = New-Object Chilkat.Charset
  2. gci *.txt |
  3. foreach{
  4.         if ($charset.VerifyFile("bom-utf-8", $_.FullName))
  5.         {
  6.                 [IO.File]::WriteAllBytes($_.FullName, (gc -enc UTF8 $_.FullName))
  7.         }
  8. }
复制代码





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