【问题标题】:Powershell encoding issues in memory内存中的 Powershell 编码问题
【发布时间】:2019-03-26 10:13:35
【问题描述】:

我正在通过 API 解析一些 XML 文本而不保存实际文件,并且当文本包含来自其他语言的字符时遇到了问题。

当尝试转换 'ë' 或类似的其他字符时,我最终会使用文本 é。有没有办法在内存中更改变量的编码,因为我没有使用任何文件。

任何帮助将不胜感激。

【问题讨论】:

  • 您至少需要向我们展示您用于更改文本的代码,最好是首先如何获取数据,因为您可能在那里有更好的控制权。
  • 我在想 $results = Invoke-RestMethod -Uri $uri -Method Post -Body $body 不会提供太多信息。从那里我对结果进行 foreach 并将其添加到数组 code $newArrayItemC | Add-Member -type NoteProperty -Name 'mbid' -Value ($conAtt.'#text') } 最后一部分 code$conAtt.'#text' 对我来说是自动转换的,我需要找到一种方法来强制对变量进行编码,因为我已经意识到由于 powershell 正在为我做一些转换,我将无法只追踪原始数据。
  • 我试图引起更多注意的是:您用于更改文本的代码是的,您显示的代码确实没办法,但我们能看到$uri$body 吗?
  • 当我在上面展开时,我没有做任何事情来更改文本。在问题的根源上,我试图找到一种在不使用文件的情况下强制对变量进行编码的方法。
  • 你想像-ContentType 'application/json; charset=utf-8'一样调整吗?当你说我没有做任何事情来更改文本时,尝试转换时也会令人困惑。。我当时没有看到你的扩展评论。因此,当您将其打印到文件时看起来不错?或者你的意思是那是你应该看到的角色?

标签: powershell encoding character-encoding


【解决方案1】:

在将文本转换为 .NET 字符串时,原始文本的字符编码似乎被误解了。

具体来说,它看起来像 UTF-8 编码的文本被误解为“ANSI”编码,或者在诸如 Invoke-WebRequest 等 cmdlet 的上下文中,被误解为类似的固定宽度单字节编码,例如ISO-8859-1,因此 UTF-8 输入中的 每个字节 本身就变成了一个字符,即使 UTF-8 将非 ASCII 范围字符编码为 multiple 个字节。

要纠正这个问题,您必须重新编码字符串

  • 使用输入字符串的错误应用编码将被误解的字符串转换回字节,从而得到原始字节表示。

  • 然后使用 true 编码将这些字节重新转换回字符串,即 UTF-8。

# Note: Works in Windows PowerShell only - in PowerShell Core,
# [Text.Encoding]::Default is *invariably* UTF-8.
$originalBytes = [Text.Encoding]::Default.GetBytes('é')
[Text.Encoding]::Utf8.GetString($originalBytes)

以上产生é

在 Windows PowerShell 中,[Text.Encoding]::Default 是您系统的“ANSI”编码;对于 ISO-8859-1 编码,使用 [Text.Encoding]::GetEncoding(28591)

请注意,PowerShell Core 不会出现整个问题,它始终默认为(BOM-less)UTF-8
如果您发现自己需要在 PowerShell Core 中使用“ANSI”编码,请参阅this answer

【讨论】:

  • 谢谢!这只是我讨厌 PowerShell 的另一个原因。在您看来,PowerShell Core 是“新的和改进的”还是只是“新的”?我有一系列我讨厌 PowerShell 的东西,包括 GitHub PowerShellGet issues you've seen me log。
  • @JohnZabroski,对我来说,不足之处在于 PowerShell Core 得到了部分改进,但仍然过于依赖向后兼容性;主要的 GitHub 问题收集了现有的不满并呼吁未来可能的版本 [政策] 允许根本性的突破性变化以摆脱历史包袱是 github.com/PowerShell/PowerShell/issues/6745
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多