对于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根据响应内容头中显式指定的 如果你需要发送一个具有特定编码的字符串给外部程序(通过管道,目标程序通过stdin接收),设置 通过管道将utf -8编码的字符串发送到外部程序:charset
字段(字符编码)或使用ISO-8859-1(它与Windows-1252的子集密切相关,但实际上是子集)自动解码它们。charset
,但实际上使用了与ISO-8859-1(例如UTF-8)不同的编码,PowerShell将误解接收到的字符串,这需要在事实之后重新编码-参见此答案。与外部程序通信时的字符编码:
$OutputEncoding
优先变量为该编码,PowerShell将自动将你的。net字符串转换为指定的编码。
但是,要正确地接收来自外部程序的UTF-8输出,仅这一点是不够的;为此,需要将$OutputEncoding = [System.Text.UTF8Encoding]::new()
[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]
)表示,即所谓的代理对。