【问题标题】:PowerShell Unicode Characters Transforming UnexpectedlyPowerShell Unicode 字符意外转换
【发布时间】:2021-03-19 02:11:27
【问题描述】:

我有一个程序,它使用几个哈希表来解析信息。我对外国角色有一些奇怪的问题。下面是一个准确的表示:

$Props =
@{
    P1  = 'Norte Americano e Inglês'
}

$Expressions =
@{
    E1  = { $Props['P1'] }
}

& $Expressions['E1']

如果我将其粘贴到 PowerShell 5.1 控制台或在 VSCode 中运行选择,我会得到:

Norte Americano e Inglês

正如预期的那样。但是如果我在 VSCose 中运行代码(按 F5)。我明白了:

Norte Americano e Inglês

通过调试,在散列文字后设置断点,我可以知道不正确的版本实际上是在散列中。所以这不是调用运算符或使用脚本块的副作用。

我尝试将输出编码设置为:

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

但这似乎并没有改变模式。坦率地说,我很惊讶控制台一开始就能很好地处理 Unicode。但是,我无法理解这种不一致。最终,这些数据被写入一个 AD 属性,如果我手动执行这些步骤,该属性仍然可以正常工作,但如果我实际运行脚本,即使输出编码设置为前面提到的,也会被破坏。

我确实查看了this Q&A,但我似乎没有遇到控制台显示问题,尽管这可能是真实类型字体的结果。也许他们在掩盖问题。

有趣的是,如果我将它切换到 PowerShell 7.1,它似乎在 VSCode 中可以正常工作。但是,由于与 AD cmdlet 的集成,通过隐式会话兼容性无法很好地运行,因此无法在此项目中使用 PowerShell Core。

开发环境是最新的 Windows 2012R2。我不确定是否可以更改 Win 10 (1909) 中提到的系统代码页。

【问题讨论】:

  • 由于源代码中的字符串文字出现问题,最可能的解释是你的脚本文件被PowerShell误解了,如果脚本保存为 UTF-8没有 BOM,就会发生这种情况。尝试将脚本保存为 UTF-8 with BOM;请参阅this answer 了解更多信息。

标签: powershell


【解决方案1】:

这很丑陋,但是如果您在代码末尾尝试这个会发生什么:

$enc = [System.Text.Encoding]::UTF8
$enc.GetString($enc.GetBytes($(& $Expressions['E1'])))

另外,这可能会帮助你Encode a string in UTF-8

【讨论】:

  • 这绝对有帮助。让我把它放到主代码中,并在早上结束这个问题。这似乎也可以[System.Text.Encoding]::UTF8.GetString( [Char[]](& $Expressions['E1']) ),但我必须看到它的输出。谢谢!
  • 在这种情况下效果很好。虽然我仍然想解释观察到的行为。无论如何,为了方便起见,我将您的样本进行了调整,并将其打包在一个函数中。再次感谢!
  • 很高兴史蒂文。我的猜测是,默认情况下 PS 标准输出似乎是 UTF8-noBOM,我们在这里强制使用 UTF8-BOM。虽然我认为默认情况下 PS 总是使用 UTF8-BOM,但这对我来说也是奇怪的行为:P
  • This answer 可能是该问题的正确解决方案:如果将脚本文件保存为 UTF-8 with BOM,Windows PowerShell 将不再误解它(PowerShell Core 默认UTF-8,因此即使没有 BOM 也能正确读取)。您的解决方案尝试在事后尝试修复已经被误解的字符串,但这不是一个完整的解决方案,因为某些 Unicode 字符可能会完全破坏脚本的阅读,例如
猜你喜欢
  • 2015-11-24
  • 2014-04-14
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多