将PowerShell(在欧洲)中的字符串转换为UTF-8



对于REST调用,我需要德语" st_ck"用

从访问数据库读取UTF-8格式的数据
$conn = New-Object System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$filename;Persist Security Info=False;")

并尝试转换它。我发现PowerShell ISE似乎在ANSI中编码字符串常量。所以我尝试了一个没有数据库的最小测试,得到了相同的结果:

$Text1 = "Stück" # entered via ISE, this is also what I get from the database
# ($StringFromDatabase -eq $Test1) shows $true
$enc = [System.Text.Encoding]::GetEncoding(1252).GetBytes($Text1)
# also tried [System.Text.Encoding]::GetEncoding("ISO-8859-1") # = 28591
$Text1 = [System.Text.Encoding]::UTF8.GetString($enc)
$Text1
$Text1 = "Stück" # = UTF-8, entered here with Notepad++, encoding set to UTF-8
"must see: $Text1"

所以我得到两个输出-转换后的输出(显示"St?ck")但我需要看到"Stück"

PowerShell ISE似乎在ANSI中编码字符串常量.

仅适用于与外部程序通信,而你正在使用进程内。net api。

作为题外话:与使用活动OEM代码页的常规控制台窗口的差异是使过时的ISE出现问题的原因之一-请参阅此答案的底部部分以获取更多信息。

内存中的字符串字面值始终是。net字符串,它们是utf -16编码的(由16位Unicode代码单元组成),能够表示所有Unicode字符。<一口>[1]


web服务调用(Invoke-RestMethod,Invoke-WebRequest)中的字符编码:

发送UTF-8字符串,指定charset=utf-8作为-ContentType参数的一部分;例如:

Invoke-RestMethod -ContentType 'text/plain; charset=utf-8' ...

接收字符串时,PowerShell根据响应内容头中显式指定的charset字段(字符编码)或使用ISO-8859-1(它与Windows-1252的子集密切相关,但实际上是子集)自动解码它们。

  • 如果给定的响应没有指定charset,但实际上使用了与ISO-8859-1(例如UTF-8)不同的编码,PowerShell将误解接收到的字符串,这需要在事实之后重新编码-参见此答案。

外部程序通信时的字符编码:

如果你需要发送一个具有特定编码的字符串给外部程序(通过管道,目标程序通过stdin接收),设置$OutputEncoding优先变量为该编码,PowerShell将自动将你的。net字符串转换为指定的编码。

通过管道将utf -8编码的字符串发送到外部程序:

$OutputEncoding = [System.Text.UTF8Encoding]::new()
但是,要正确地接收来自外部程序的UTF-8输出,仅这一点是不够的;为此,需要将[Console]::OutputEncoding设置为相同的编码。

让你的PowerShell会话完全支持utf -8(无论在ISE还是常规控制台窗口中):

# Needed in the ISE only:
chcp >$null # Dummy console-program call that ensures that a console is allocated.
# Set all encodings relevant to communicating with external programs to UTF-8.
$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding =
[System.Text.UTF8Encoding]::new()

更多信息请看答案


[1]但是,请注意,码位大于0xFFFF的Unicode字符,即所谓的BMP(基本多语言平面)之外的字符,必须用两个16位代码单元([char])表示,即所谓的代理对

相关内容

  • 没有找到相关文章

最新更新