源代码中字符串文字的字符编码问题(utf8 无 bom)

问题描述 投票:0回答:1
$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 编码?

powershell utf-8 character-encoding codepages invoke-command
1个回答
4
投票

注意:远程处理和使用

Invoke-Command
是您的问题的附带

由于问题发生在您的

源代码 (...\01_Klassenbücher\...) 中的 字符串文字

,最可能的解释是您的 
脚本文件被 PowerShell 误解了。

Windows PowerShell 中,如果 您的脚本文件实际上是 UTF-8 编码但 缺少 BOM,PowerShell 引擎将误解任何非 ASCII 范围字符(例如 ü

) )在脚本中。
[1]

因此:

将脚本重新保存为 UTF-8 with BOM

注:


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

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

相比之下,PowerShell ISE 创建“ANSI”编码的

[1] 文件,Windows PowerShell(但不是 PowerShell Core)可以正确读取这些文件。

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

  • 如果您的脚本永远不会在 PowerShell 中运行

    Core - 所有未来的开发工作都将去那里。

  • 如果您的脚本永远不会在

    不同“ANSI”代码页有效的计算机上运行。

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

鉴于这些限制,

最安全且面向未来的做法是始终将 PowerShell 脚本创建为带有 BOM 的 UTF-8 (或者,您可以使用 UTF-16(始终使用 BOM 保存),但如果您主要使用 ASCII/“ANSI”范围字符(这可能在 PS 脚本中),那么文件大小会增大)。
如何让 Visual Studio Code 为 PowerShell 脚本

默认
创建 UTF-8 文件

with-BOM 注意:自 VSCode PowerShell 扩展 v1.11.0 起,仍需要以下内容,但并不是说有

建议将扩展

default PowerShell 文件设置为 UTF-8 with 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。


© www.soinside.com 2019 - 2024. All rights reserved.