【问题标题】:How to find and replace a string with PowerShell - issue with Eastern European characters如何使用 PowerShell 查找和替换字符串 - 东欧字符问题
【发布时间】:2017-07-07 22:42:28
【问题描述】:

我正在编写一个 PowerShell 脚本来查找和替换包含东欧字符的 xml 标记并将它们更改为英文。

我的源文件以 UTF-8 编码。

我的代码:

$content = [System.IO.File]::ReadAllText("file.xml").Replace("<Číslo_zboží>","<Code>")
[System.IO.File]::WriteAllText("file.xml", $content)

虽然我可以成功地找到并用标准英文字符替换标签,但 PowerShell 会忽略那些包含东欧字符的标签。非常感谢您的建议。

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    [System.IO.File] 类的方法默认为 (BOM-less) UTF-8,因此假设 file.xml 是 UTF-8 编码的(无论是否使用 BOM),读取和写入该文件应该按预期工作,但请注意,writing 将导致 no BOM。

    我怀疑问题在于您的源文件,尽管是 UTF-8 编码的,缺少 BOM,而 Windows PowerShell (不幸的是)需要才能识别 UTF-8 编码。

    在没有 BOM 的情况下,Windows PowerShell 将源文件解释为“ANSI”编码,这是系统的旧系统区域设置所隐含的单字节扩展 ASCII 编码。 因此,即使您的脚本的实际编码是 UTF-8,缺少 BOM 意味着 Windows PowerShell 将误解脚本中的非 ASCII 字符,因此基于 脚本中定义的字符串文字将无法按预期工作

    为安全起见,请始终创建带有 BOM 的 UTF-8 编码的 PowerShell 脚本

    注意即将推出的跨平台 PowerShell Core will likely switch to (BOM-less) UTF-8 as the default,但它会继续识别 BOM,因此将 UTF-8 脚本 with 保存为 BOM 应该是面向未来的方法。

    【讨论】:

    • 非常感谢您的帮助。我现在已将代码更改为 (Get-Content -path "C:\file.xml").replace('', '') | Set-Content -Encoding UTF8 -Path "C:\file.xml" 以保留 BOM,它就像一个魅力!
    • @OKOndrej:我很高兴听到这个消息;我的荣幸。请注意,Get-Content 也默认为“ANSI”编码,以防文件没有 BOM。
    猜你喜欢
    • 2019-03-05
    • 2021-12-19
    • 2021-12-11
    • 2017-06-15
    • 2013-02-23
    • 2023-03-28
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多