【问题标题】:Character-encoding problem with string literal in source code源代码中字符串文字的字符编码问题
【发布时间】:2019-07-14 08:28:54
【问题描述】:
$logstring = Invoke-Command -ComputerName $filesServer   -ScriptBlock {
        param(
            $logstring,
            $grp
        )

    $Klassenbuchordner = "KB " + $grp.Gruppe
    $Gruppenordner = $grp.Gruppe
    $share = $grp.Gruppe
    $path = "D:\Gruppen\$Gruppenordner"

    if ((Test-Path D:\Dozenten\01_Klassenbücher\$Klassenbuchordner) -eq $true)
    {$logstring += "Verzeichnis für Klassenbücher existiert bereits"}
    else {
        mkdir D:\Dozenten\01_Klassenbücher\$Klassenbuchordner
        $logstring += "Klassenbuchordner wurde erstellt!"
    }} -ArgumentList $logstring, $grp

我的目标是测试目录是否存在并按需创建。

问题在于路径包含德语字母(元音变音),目标服务器无法正确识别。

例如,服务器接收到路径"D:\Dozent\01_Klassenbücher",而不是预期的"D:\Dozent\01_Klassenbücher"

如何强制使用正确的 UTF-8 编码?

【问题讨论】:

  • @AdminOfThings: chcp 65001 在这里没有发挥作用,因为没有与外部程序的交互。然而,即便如此,它也无济于事,因为在 PowerShell 会话 inside 运行 chcp$OutputEncoding[Console]::OutputEncoding 没有影响,这些设置对于与外部程序交互很重要.

标签: powershell utf-8 character-encoding codepages invoke-command


【解决方案1】:

注意:远程处理和使用Invoke-Command偶然您的问题

由于您的源代码 (...\01_Klassenbücher\...) 中的字符串文字 出现问题,最可能的解释是您的脚本文件被PowerShell 误解了.

在 Windows PowerShell(相对于 PowerShell Core (v6+))中,如果您的脚本文件实际上是 UTF-8 编码但缺少 BOM ,PowerShell 引擎将误解脚本中的任何非 ASCII 范围字符(例如 ü)。[1]

因此:将您的脚本重新保存为 UTF-8 与 BOM


为什么您应该将脚本保存为带有 BOM 的 UTF-8:

Visual Studio Code 和其他现代编辑器默认创建 UTF-8 文件没有 BOM,这就是导致 Windows PowerShell 出现问题的原因。

相比之下,PowerShell ISE 创建“ANSI”编码的[1] 文件,Windows PowerShell(但不是 PowerShell Core)可以正确读取这些文件。

您只能使用“ANSI”编码的文件:

  • 如果您的脚本永远不会在 PowerShell Core 中运行 - 所有未来的开发工作都会去那里。

  • 如果您的脚本永远不会在不同“ANSI”代码页生效的机器上运行。

  • 如果您的脚本不包含无法用“ANSI”代码页表示的字符(例如表情符号)。

鉴于这些限制,始终将 PowerShell 脚本创建为 UTF-8 和 BOM 是最安全且经得起未来考验的。
(或者,您可以使用 UTF-16(它始终与 BOM 一起保存 ),但如果您主要使用 ASCII/“ANSI”范围的字符,则文件大小会膨胀,这很可能在 PS 脚本中)。


如何让 Visual Studio Codewith-BOM 为 PowerShell 脚本创建 UTF-8 文件默认

注意:从PowerShell extension for VSCode 的 v1.11.0 开始,以下内容仍然是必需的,但没有建议将扩展名 default PowerShell 文件设置为 UTF-8 带 BOM on GitHub.

将以下内容添加到您的 settings.json 文件中(从命令面板(Ctrl+Shift+P,键入 settings 并选择 Preferences: Open Settings (JSON)):

"[powershell]": {
  "files.encoding": "utf8bom"
}

请注意,设置仅适用于 PowerShell 文件,因为您不希望 所有 文件默认为 UTF-8 使用 BOM,因为 Unix 平台上的许多实用程序既不期望也不知道如何处理这样的 BOM。


[1] 在没有 BOM 的情况下,Windows PowerShell 默认为系统当前“ANSI”代码页的编码,由旧系统区域设置确定;例如,在西欧文化中,Windows-1252。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多