【问题标题】:Powershell script to change encoding alters accented characters用于更改编码的 Powershell 脚本会更改重音字符
【发布时间】:2020-12-20 03:58:58
【问题描述】:

我们有一些摘录从不同的系统发送给我们。编码不断变化。我们需要在内部保持这一点。编写了一个 PowerShell 脚本以将编码更改为 UTF-8。但是重音字符发生了变化。名称 Denaè 更改为 Denaè 我想保留名称为 Denaè 吗?任何帮助将不胜感激。

我想使用 PowerShell 将文件更改为 UTF-8,但重音字符不变。有可能吗?

冯普瑞兹

这是我现在拥有的代码

$Source = 'C:\Source'

$Destination = 'C:\Destination'

$Utf8NoBomEncoding = 新对象 System.Text.UTF8Encoding($False)

移除项目 $Destination -Recurse -Force

foreach ($i in Get-ChildItem $Source -Recurse -Force) { 如果($i.PSIsContainer){ 继续 }

$path = $i.DirectoryName.Replace($Source, $Destination)
$name = $i.Fullname.Replace($Source, $Destination)

if ( !(Test-Path $path) ) {
    New-Item -Path $path -ItemType directory
}

$content = get-content $i.Fullname

if ( $content -ne $null ) {
    [System.IO.File]::WriteAllLines($name, $content, $Utf8NoBomEncoding)
} else {
    Write-Host "No content from: $i"   
}

}

【问题讨论】:

  • 替换 è -> è 看起来像文件被转换为纯文本,所以它不再是 Unicode。使用minimal reproducible example 显示处理文件的相关代码部分。
  • Powershell 5.1 get-content 不会在没有“-encoding utf8”参数的情况下检测到 utf8 no bom。

标签: powershell encoding utf-8


【解决方案1】:

è字符字符è的UTF-8外观带有Grave的拉丁文小写字母E(代码点U+00E8)。

证明:

[System.Text.Encoding]::UTF8.GetBytes([char]'è') -join ', '
# 195, 168

[System.Text.Encoding]::GetEncoding(1252).GetBytes([char[]]'è') -join ', '
# 195, 168

[char[]][System.Text.Encoding]::UTF8.GetBytes([char]'è') -join ''
# è

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2011-02-28
    • 2014-09-06
    • 2013-10-02
    • 1970-01-01
    • 2010-09-23
    • 2012-09-20
    • 1970-01-01
    • 2013-08-19
    相关资源
    最近更新 更多