如何在 PowerShell 字符串文字中对 Unicode 字符代码进行编码?

问题描述 投票:0回答:7

如何在 PowerShell 字符串中对 Unicode 字符 U+0048 (H) 进行编码?

在 C# 中我会这样做:

"\u0048"
,但这似乎在 PowerShell 中不起作用。

powershell unicode string-literals unicode-literals
7个回答
96
投票

将 '\u' 替换为 '0x' 并将其转换为 System.Char:

PS > [char]0x0048
H

您还可以使用“$()”语法将 Unicode 字符嵌入到字符串中:

PS > "Acme$([char]0x2122) Company"
AcmeT Company

其中 T 是 PowerShell 对非注册商标字符的表示。

注意:此方法仅适用于 Plane 0、BMP(基本多语言平面)、chars 中的字符 < U+10000.


30
投票

根据文档,PowerShell Core 6.0 添加了对此转义序列的支持:

PS> "`u{0048}"
H

请参阅https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_special_characters?view=powershell-6#unicode-character-ux


17
投票

也许这不是 PowerShell 的方式,但这就是我所做的。我发现它更干净。

[regex]::Unescape("\u0048") # Prints H
[regex]::Unescape("\u0048ello") # Prints Hello

5
投票

对于我们这些仍在 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() }
}

请注意,让这些显示在控制台中是一个完全是另一个问题,但如果您输出到Outlook电子邮件或Gridview(如下),它就会正常工作(因为utf16是.NET接口的本机) .

这也意味着如果您更熟悉十进制,您也可以很容易地输出普通控制(不一定是 unicode)字符,因为您实际上不需要使用

0x
(十六进制)语法来生成整数。
'hello',160,'there' | Unicode
会在两个单词之间放置一个 不间断空格,就像您使用
0xA0
一样。


4
投票

使用 PowerShell 的另一种方法。

$Heart = $([char]0x2665)
$Diamond = $([char]0x2666)
$Club = $([char]0x2663)
$Spade = $([char]0x2660)
Write-Host $Heart -BackgroundColor Yellow -ForegroundColor Magenta

使用命令

help Write-Host -Full
阅读所有相关内容。


4
投票

要使其适用于 BMP 之外的字符,您需要使用 Char.ConvertFromUtf32()

'this is my favourite park ' + [char]::ConvertFromUtf32(0x1F3DE) + 
'. It is pretty sweet ' + [char]::ConvertFromUtf32(0x1F60A)

在 PowerShell 6.0 或更高版本中,您还可以使用

`u{}

"this is my favourite park `u{1F3DE}. It is pretty sweet `u{1F60A}"

这个特殊字符是在 PowerShell 6.0 中添加的。

Unicode 转义序列 (

`u{x}
) 允许您通过其代码点的十六进制表示来指定任何 Unicode 字符。这包括基本多语言平面 (>
0xFFFF
) 之上的 Unicode 字符,其中包括表情符号字符,例如竖起大拇指 (
`u{1F44D}
) 字符。 Unicode 转义序列需要至少 1 个十六进制数字,最多支持 6 个十六进制数字。该序列的最大十六进制值为
10FFFF

Unicode 字符 (
`u{x}
)


0
投票

请注意,像 🌎 这样的某些字符可能需要打印“双符文”:

   PS> "C:\foo\bar\$([char]0xd83c)$([char]0xdf0e)something.txt"

将打印:

   C:\foo\bar\🌎something.txt

您可以在此处的“unicode escape”行中找到这些“符文”:

   https://dencode.com/string
© www.soinside.com 2019 - 2024. All rights reserved.