标题: [问题求助] [已解决]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 编辑
获取文件编码的函数- #函数 获取文件编码
- function Get-FileCoder($file_path){
- $bytes = [System.IO.File]::ReadAllBytes($file_path)
- if($bytes[0] -eq 0xff -and $bytes[1] -eq 0xfe){ return 'utf-16_le' }
- if($bytes[0] -eq 0xfe -and $bytes[1] -eq 0xff){ return 'utf-16_be' }
- if($bytes[0] -eq 0xef -and $bytes[1] -eq 0xbb -and $bytes[2] -eq 0xbf){ return 'utf-8_bom' }
- $index = 0; $bu8 = $false
- while($index -lt $bytes.Count){
- $one = 0
- for($i = 0; $i -lt 8; $i++){
- if(($bytes[$index] -band (0x80 -shr $i)) -eq 0){ break; }
- ++$one
- }
- if($one -eq 0){
- ++$index
- } else {
- if($one -eq 1){ return 'ansi' }
- $bu8 = $true
- for($i = 0; $i -lt $one-1; $i++){
- ++$index
- if(($bytes[$index] -band 0x80) -ne 0x80){ return 'ansi' }
- }
- ++$index
- }
- }
- if($bu8){return 'utf-8'} else { return 'ansi'}
- }
复制代码
作者: went 时间: 2022-1-12 14:39
- $cp = Get-FileCoder -file_path 't.txt'
- if($cp -eq 'utf-8'){
- $s = Get-Content -Encoding UTF8 -Path 't.txt'
- } elseif( $cp -eq 'ansi'){
- $s = Get-Content -Encoding Default -Path 't.txt'
- }
- [System.IO.File]::WriteAllLines('t2.txt',$s)
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |