源代码中字符串文字的字符编码问题
Character-encoding problem with string literal in source code
$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_Klassenbücher$Klassenbuchordner) -eq $true)
{$logstring += "Verzeichnis für Klassenbücher existiert bereits"}
else {
mkdir D:\Dozenten_Klassenbücher$Klassenbuchordner
$logstring += "Klassenbuchordner wurde erstellt!"
}} -ArgumentList $logstring, $grp
我的目标是测试目录是否存在并按需创建。
问题是路径包含德语字母(变音符号),目标服务器无法正确识别这些字母。
例如,服务器收到路径 "D:\Dozent_Klassenbücher"
而不是预期的 "D:\Dozent_Klassenbücher"
。
如何强制使用正确的 UTF-8 编码?
注意:Invoke-Command
的远程处理和使用 偶然 您的问题。
由于您的 源代码 (..._Klassenbücher\...
) 中的 字符串文字 出现问题,最可能的解释是PowerShell.
错误解释了您的 脚本文件
在 Windows PowerShell 中,如果 您的脚本文件实际上是 UTF-8 编码的但缺少 BOM,PowerShell 引擎将误解任何非 ASCII 范围的字符(例如ü
) 在脚本中。[1]
因此:将您的脚本重新保存为 UTF-8 with BOM.
注:
- 在按需安装的跨平台 PowerShell (Core) 7+ 版本中,UTF-8 BOM 不再是严格必需的(始终 默认 为(BOM- less) UTF-8),但如果您希望您的脚本在两个 PowerShell 版本中工作,则仍然需要。
为什么要将脚本保存为带 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 脚本创建为 UTF-8 和 BOM 是最安全且面向未来的。
(或者,您可以使用 UTF-16(它总是保存 和 BOM),但是如果您主要使用 ASCII/“ANSI”范围的字符,那么文件大小会膨胀,这可能在 PS 脚本中)。
如何使用 Visual Studio 代码为 PowerShell 脚本 with-BOM 创建 UTF-8 文件默认:
注意:从 PowerShell extension for VSCode, but not that there's a suggestion to make the extension default PowerShell files to UTF-8 with BOM on GitHub.
的 v1.11.0 开始,以下内容仍然是必需的
将以下内容添加到您的 settings.json
文件(从命令面板(Ctrl+Shift+P,键入 settings
和 select Preferences: Open Settings (JSON)
):
"[powershell]": {
"files.encoding": "utf8bom"
}
请注意,设置有意限定为 PowerShell 文件 ,因为您不希望 所有 文件默认为 UTF-8 和 BOM,鉴于 Unix 平台上的许多实用程序既不期望也不知道如何处理这样的 BOM。
[1] 在没有 BOM 的情况下,Windows PowerShell 默认使用系统当前“ANSI”代码页的编码,由遗留系统区域设置确定;例如,在西欧文化中,Windows-1252.
$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_Klassenbücher$Klassenbuchordner) -eq $true)
{$logstring += "Verzeichnis für Klassenbücher existiert bereits"}
else {
mkdir D:\Dozenten_Klassenbücher$Klassenbuchordner
$logstring += "Klassenbuchordner wurde erstellt!"
}} -ArgumentList $logstring, $grp
我的目标是测试目录是否存在并按需创建。
问题是路径包含德语字母(变音符号),目标服务器无法正确识别这些字母。
例如,服务器收到路径 "D:\Dozent_Klassenbücher"
而不是预期的 "D:\Dozent_Klassenbücher"
。
如何强制使用正确的 UTF-8 编码?
注意:Invoke-Command
的远程处理和使用 偶然 您的问题。
由于您的 源代码 (..._Klassenbücher\...
) 中的 字符串文字 出现问题,最可能的解释是PowerShell.
在 Windows PowerShell 中,如果 您的脚本文件实际上是 UTF-8 编码的但缺少 BOM,PowerShell 引擎将误解任何非 ASCII 范围的字符(例如ü
) 在脚本中。[1]
因此:将您的脚本重新保存为 UTF-8 with BOM.
注:
- 在按需安装的跨平台 PowerShell (Core) 7+ 版本中,UTF-8 BOM 不再是严格必需的(始终 默认 为(BOM- less) UTF-8),但如果您希望您的脚本在两个 PowerShell 版本中工作,则仍然需要。
为什么要将脚本保存为带 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 脚本创建为 UTF-8 和 BOM 是最安全且面向未来的。
(或者,您可以使用 UTF-16(它总是保存 和 BOM),但是如果您主要使用 ASCII/“ANSI”范围的字符,那么文件大小会膨胀,这可能在 PS 脚本中)。
如何使用 Visual Studio 代码为 PowerShell 脚本 with-BOM 创建 UTF-8 文件默认:
注意:从 PowerShell extension for VSCode, but not that there's a suggestion to make the extension default PowerShell files to UTF-8 with BOM on GitHub.
的 v1.11.0 开始,以下内容仍然是必需的将以下内容添加到您的 settings.json
文件(从命令面板(Ctrl+Shift+P,键入 settings
和 select Preferences: Open Settings (JSON)
):
"[powershell]": {
"files.encoding": "utf8bom"
}
请注意,设置有意限定为 PowerShell 文件 ,因为您不希望 所有 文件默认为 UTF-8 和 BOM,鉴于 Unix 平台上的许多实用程序既不期望也不知道如何处理这样的 BOM。
[1] 在没有 BOM 的情况下,Windows PowerShell 默认使用系统当前“ANSI”代码页的编码,由遗留系统区域设置确定;例如,在西欧文化中,Windows-1252.