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

[问题求助] [已解决]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)

这个问题, 在实际情况中非常频繁, 求路过的论坛元老指点一下迷津, 感谢!

TOP

自己先检测文件编码,然后再读写文件. 自己写个检测编码的脚本.
微信:flashercs
QQ:49908356

TOP

回复 3# flashercs


    感谢指点, 就是卡在这里了, 在PS中怎么检测? 找了一个C#的文章, 不知道怎么在PS中使用:
https://www.cnblogs.com/nearpengju123/p/4549497.html

TOP

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

TOP

  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)
复制代码
1

评分人数

    • 5i365: 非常感谢, 解决了我长期困扰的问题!技术 + 1

TOP

返回列表