内存中的Powershell编码问题

时间:2018-10-30 19:37:53

标签: powershell encoding character-encoding

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

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

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

要解决此问题,您必须重新编码字符串

  • 使用输入字符串的错误应用的编码将误解的字符串转换回字节,以获得原始的字节表示形式。

  • 然后使用 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 不会完全出现整个问题,而PowerShell Core 始终默认为(无BOM) UTF-8
如果您甚至在PowerShell Core中也需要使用“ ANSI”编码,请参阅this answer

相关问题