我在不保存实际文件的情况下通过 API 解析一些 XML 文本,并且当文本包含来自其他语言的字符时遇到问题。
当尝试转换 'ë' 或类似这样的其他字符时,我最终得到的是文本 É。有没有一种方法可以更改内存中变量的编码,因为我没有使用任何文件。
如有任何帮助,我们将不胜感激。
最佳答案
当文本转换为 .NET 字符串时,看起来原始文本的字符编码被误解了。
具体来说,它看起来像 UTF-8 编码的文本被误解为“ANSI”编码,或者在 Invoke-WebRequest
等 cmdlet 的上下文中,作为类似的固定-宽度单字节编码如ISO-8859-1 ,因此 UTF-8 输入中的每个字节本身就变成了一个字符,即使 UTF-8 将非 ASCII 范围的字符编码为多个 字节。
要更正此问题,您必须重新编码字符串:
使用输入字符串的错误应用编码将被误解的字符串转换回字节,以获得原始字节表示。
然后使用 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)UTF-8。
如果您发现自己甚至在 PowerShell Core 中也需要使用“ANSI”编码,请参阅 this answer .
关于内存中的 Powershell 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53071711/