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

[问题求助] 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. }
复制代码

本帖最后由 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. }
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 13# idwma


    多谢大侠指教, 貌似明白了, 我找几个不同编码的文件, 然后看看他们的前几个字符呗
1

评分人数

    • idwma: 感谢分享技术 + 1

TOP

回复 12# 5i365


    代码里不是有吗?
$text[0]这是几?

TOP

回复 11# idwma


    怎么看字节的数字? 对这个一直不懂

TOP

本帖最后由 idwma 于 2022-3-17 18:04 编辑

回复 10# 5i365


这些数字是文件前3个字节的值
你看看bom utf8文件前3个字节的值是不是这3个数

TOP

回复 9# idwma


    哦, 刚刚看了一下,确实锁了,

zaqmlp 大侠, 抱歉, 晚辈我上楼忘加上引用您的代码了, 已经加上
_________________________________________________________

这个代码, 按发贴的要求,应该是识别带BOM的UTF8, 好像没有识别ANSI, 不太懂那里的数字是怎么得出来的, 所以就想问问您

TOP

回复 8# 5i365


    看不见z大的代码
这个就挻好的完美

TOP

本帖最后由 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. }
复制代码

TOP

回复 6# idwma


    现在我的WIN7系统就差个下面这个计划任务代码了, 每隔五分钟就执行一下上面的转码, 但是突然感觉可能会有意外发生, 比如, 我还没有拷过去, 正好到5分钟了, 那岂不出错?
http://www.bathome.net/thread-61669-1-1.html

TOP

本帖最后由 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. }
复制代码
1

评分人数

    • 5i365: 乐于分享, 技术牛X技术 + 1

TOP

本帖最后由 5i365 于 2022-2-21 19:15 编辑

回复 3# idwma


    感谢提醒, 其实以前went大佬就给过代码了, 但是我感觉太长了, 要是能加个小判断, 不是UTF8 就跳过就好了, 因为 不管原文件是什么编码, 第一次转后, 肯定会变成 UTF8
http://www.bathome.net/redirect. ... 1288&pid=250426

TOP

回复 2# for_flr


    感谢两位大佬指引,   不管原文件是什么编码, 第一次转后, 肯定会变成 UTF8, 只要加个判断 是UTF8 跳过就行了

TOP

回复 2# for_flr


    4行写入的文件是没有bom的,识别没有bom头的文件编码有点难度

TOP

再次运行代码的时候,get-content到的就已经是乱码了,因为get-content默认的ansi。
改一改went大神给你的编码函数那个帖子,应该可以解决你的问题。

TOP

返回列表