【问题标题】:encoding issue in powershell search and replacepowershell搜索和替换中的编码问题
【发布时间】:2016-07-22 09:14:53
【问题描述】:

我正在对 XML 文件递归地运行一个 powershell 脚本来搜索和替换文本。该代码在搜索和替换文本方面工作正常。但是,在某些文件中,还有其他语言文本,例如 fréquentes,在运行脚本后会更改为 fréquentes。我一直在脚本中使用 UTF8 编码。关于如何保留编码的任何指示?

$content| Foreach-Object{$_ -replace 'test1' , 'testing'`
                            -replace 'test2' , 'testing' }| Out-File file.FullName -Encoding utf8   

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    您似乎忽略了 XML 文件的编码,它似乎是拉丁语 1。XML 文件在开始时指定了它们的编码(或者,如果它们没有,它们将被自动检测为 UTF-8、UTF-16、或 UTF-32):

    <?xml version='1.0' encoding='utf-8'?>
    

    所以在我看来,您使用正确的编码读取内容,但使用与声明的不匹配的 UTF-8 写入文件。

    您可以使用 XML API 来更改文件,这可能更可取,或者只是将您的 Out-File 更改为

    Out-File -Encoding Default
    

    然而,这可能会导致不同计算机之间的编码不同,所以要小心。我几乎只将它用于我知道系统遗留代码页中的文件,或者用于快速一次性脚本。

    【讨论】:

    • 感谢您的回复。将其更改为默认值即可。我的 XML 文件包含以下内容,这就是我尝试在脚本中使用 utf8 的原因。 default 是指使用 XML 文件中已有的相同编码还是将 XML 文件从 utf-8 更改为默认编码
    • Default 表示使用系统的旧代码页,这就是为什么通常使用它是个坏主意。这种编码只是为了迎合非 Unicode 应用程序而存在,但文本文件通常也采用这种编码。如果 XML 文件 正确地 声明为 UTF-8,那么您发布的代码应该不会造成任何损害。避免这种情况的另一个选择是,如果您的替换不包含非 ASCII 字符,则仅使用 Default 来读取 写入。这样,非 ASCII 的所有内容都会被传递(如果您使用 8 位遗留代码页;大多数都这样做)。
    猜你喜欢
    • 2011-11-09
    • 2011-03-19
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多