Board logo

标题: [问题求助] [已解决]PowerShell如何防止另存UTF8格式时出现乱码 [打印本页]

作者: 5i365    时间: 2022-1-11 20:16     标题: [已解决]PowerShell如何防止另存UTF8格式时出现乱码

本帖最后由 5i365 于 2022-1-12 15:04 编辑

下面的代码,可以另存为UTF8格式的txt文件, 但是经常出现乱码,
不用set-content的原因是, 存成的UTF8是带BOM的
当t.txt是ANSI编码格式时, 使用下面的代码另存为的t2.txt就会产生乱码, 如果t.txt是UTF8编码格式时, 就没有乱码
但是我提前并不知道t.txt的编码格式, 这种情况下怎么防止另存为的2.txt产生乱码?

$s = gc -Encoding UTF8 "C:\Users\Administrator\Desktop\t.txt"
[io.file]::WriteAllLines("C:\Users\Administrator\Desktop\t2.txt", $s)

作者: 5i365    时间: 2022-1-12 09:17

这个问题, 在实际情况中非常频繁, 求路过的论坛元老指点一下迷津, 感谢!
作者: flashercs    时间: 2022-1-12 13:21

自己先检测文件编码,然后再读写文件. 自己写个检测编码的脚本.
作者: 5i365    时间: 2022-1-12 14:21

回复 3# flashercs


    感谢指点, 就是卡在这里了, 在PS中怎么检测? 找了一个C#的文章, 不知道怎么在PS中使用:
https://www.cnblogs.com/nearpengju123/p/4549497.html
作者: went    时间: 2022-1-12 14:34

本帖最后由 went 于 2022-1-12 15:44 编辑

获取文件编码的函数
  1. #函数 获取文件编码
  2. function Get-FileCoder($file_path){
  3.     $bytes = [System.IO.File]::ReadAllBytes($file_path)
  4.     if($bytes[0] -eq 0xff -and $bytes[1] -eq 0xfe){ return 'utf-16_le' }
  5.     if($bytes[0] -eq 0xfe -and $bytes[1] -eq 0xff){ return 'utf-16_be' }
  6.     if($bytes[0] -eq 0xef -and $bytes[1] -eq 0xbb -and $bytes[2] -eq 0xbf){ return 'utf-8_bom' }
  7.     $index = 0; $bu8 = $false
  8.     while($index -lt $bytes.Count){
  9.         $one = 0
  10.         for($i = 0; $i -lt 8; $i++){
  11.             if(($bytes[$index] -band (0x80 -shr $i)) -eq 0){ break; }
  12.             ++$one
  13.         }
  14.         if($one -eq 0){
  15.             ++$index
  16.         } else {
  17.             if($one -eq 1){ return 'ansi' }
  18.             $bu8 = $true
  19.             for($i = 0; $i -lt $one-1; $i++){
  20.                 ++$index
  21.                 if(($bytes[$index] -band 0x80) -ne 0x80){ return 'ansi' }
  22.             }
  23.             ++$index
  24.         }
  25.     }
  26.     if($bu8){return 'utf-8'} else { return 'ansi'}
  27. }
复制代码

作者: went    时间: 2022-1-12 14:39

  1. $cp = Get-FileCoder -file_path 't.txt'
  2. if($cp -eq 'utf-8'){
  3.     $s = Get-Content -Encoding UTF8 -Path 't.txt'
  4. } elseif( $cp -eq 'ansi'){
  5.     $s = Get-Content -Encoding Default -Path 't.txt'
  6. }
  7. [System.IO.File]::WriteAllLines('t2.txt',$s)
复制代码





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