我该如何在PowerShell字符串中编码Unicode字符U+0048(H)?
在C#中,我只需执行以下操作:"\u0048"
,但这似乎在PowerShell中不起作用。
我该如何在PowerShell字符串中编码Unicode字符U+0048(H)?
在C#中,我只需执行以下操作:"\u0048"
,但这似乎在PowerShell中不起作用。
将 '\u' 替换为 '0x' 并将其转换为 System.Char 类型:
PS > [char]0x0048
H
PS > "Acme$([char]0x2122) Company"
AcmeT Company
T 是 PowerShell 表示非注册商标符号的字符。
注意:此方法仅适用于平面0(BMP,基本多语言平面)中的字符,即 Unicode 编码小于 U+10000 的字符。
\u
的函数。它与Joey的函数完全相同,只是名称不同。因此,该函数为function \u($n) {[char][int]"0x$n"}
。调用它的方式与C#类似,只是需要在函数名和数字之间加上一个空格。所以\u 0048
返回H
。 - chris[char]0x1D400
:InvalidArgument: 无法将值“119808”转换为类型“System.Char”。错误:“值对于字符来说太大或太小。”
- norajchar
类型表示UTF-16代码单元,对于BMP字符,1个字符=1个代码单元,但对于非BMP字符,1个字符=2个代码单元。/// @chris \u
函数可以扩展以适用于非BMP字符。 - undefined根据文档,PowerShell Core 6.0通过这个转义序列提供支持:
PS> "`u{0048}"
H
也许这不是PowerShell的方式,但这就是我所做的。我发现这样更加简洁。
[regex]::Unescape("\u0048") # Prints H
[regex]::Unescape("\u0048ello") # Prints Hello
对于我们仍在使用5.1版本并且想要使用高阶Unicode字符集(这些答案都不适用)的人,我创建了此函数,因此您可以简单地构建字符串,如下所示:
'this is my favourite park ',0x1F3DE,'. It is pretty sweet ',0x1F60A | Unicode
#takes in a stream of strings and integers,
#where integers are unicode codepoints,
#and concatenates these into valid UTF16
Function Unicode {
Begin {
$output=[System.Text.StringBuilder]::new()
}
Process {
$output.Append($(
if ($_ -is [int]) { [char]::ConvertFromUtf32($_) }
else { [string]$_ }
)) | Out-Null
}
End { $output.ToString() }
}
0x
(十六进制)语法来生成整数。 'hello',32,'there' | Unicode
会在两个单词之间放置一个不间断空格,就像你使用0x20
一样。"\u{}"
就写 [char]blahblahblah
,但它确实简化了 if
语句。 - Hashbrown$_ -shr 11
替代 [int][math]::Floor($_ / 0x400)
,还应该使用 ($_ -band 0x3FF) -bor 0xDC00
替代 [char]($_ % 0x400 + 0xDC00)
。 - phuclv如果要使得字符超出BMP范围,你需要使用Char.ConvertFromUtf32()。
'this is my favourite park ' + [char]::ConvertFromUtf32(0x1F3DE) +
'. It is pretty sweet ' + [char]::ConvertFromUtf32(0x1F60A)
另一种方法是使用PowerShell。
$Heart = $([char]0x2665)
$Diamond = $([char]0x2666)
$Club = $([char]0x2663)
$Spade = $([char]0x2660)
Write-Host $Heart -BackgroundColor Yellow -ForegroundColor Magenta
使用命令help Write-Host -Full
来详细了解它。
[char]0x2665
。实际上,这种方法效率更低,因为你需要为每个变量创建一个新的子shell而不是直接赋值:$Heart = [char]0x2665
。 - phuclv PS> "C:\foo\bar\$([char]0xd83c)$([char]0xdf0e)something.txt"
会打印:
C:\foo\bar\something.txt
你可以在“unicode转义”行中找到这些“符文”:
https://dencode.com/string