58

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

在 C# 中,我会这样做:"\u0048",但这似乎在 PowerShell 中不起作用。

4

7 回答 7

80

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

PS > [char]0x0048
H

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

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

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

于 2009-06-29T07:26:42.077 回答
22

根据文档,PowerShell Core 6.0 增加了对这个转义序列的支持:

PS> "`u{0048}"
H

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

于 2018-03-20T10:34:17.643 回答
15

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

[regex]::Unescape("\u0048") # Prints H
[regex]::Unescape("\u0048ello") # Prints Hello
于 2015-09-08T17:18:04.197 回答
3

使用 PowerShell 的另一种方法。

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

使用该命令help Write-Host -Full阅读所有相关信息。

于 2020-09-29T21:28:19.473 回答
1

对于我们这些仍在使用 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(hex) 语法来生成整数。'hello',32,'there' | Unicode会在两个单词之间放置一个不间断的空格,就像你这样做一样0x20

于 2020-03-24T05:26:08.473 回答
1

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

'this is my favourite park ' + [char]::ConvertFromUtf32(0x1F3DE) + 
'. It is pretty sweet ' + [char]::ConvertFromUtf32(0x1F60A)
于 2020-03-24T05:38:45.797 回答
0

请注意,某些字符可能需要打印“双符文”:

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

将打印:

   C:\foo\bar\something.txt

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

   https://dencode.com/string
于 2021-05-28T06:42:33.593 回答