在 Powershell 中拆分表情符号序列
Spliting an emoji sequence in powershell
我有一个仅填充表情符号的文本框。没有空格或任何类型的字符。我需要拆分这些表情符号才能识别它们。这是我试过的:
function emoji_to_unicode(){
foreach ($emoji in $textbox.Text) {
$unicode = [System.Text.Encoding]::Unicode.GetBytes($emoji)
Write-Host $unicode
}
}
不是一个一个地打印字节,而是循环 运行 一次,打印所有连接在一起的表情符号的代码。就好像所有的表情符号都是一个项目。我测试了 6 个表情符号,而不是得到这个:
61 216 7 222
61 216 67 222
61 216 10 222
61 216 28 222
61 216 86 220
60 216 174 223
我明白了:
61 216 7 222 61 216 67 222 61 216 10 222 61 216 28 222 61 216 86 220 60 216 174 223
我错过了什么?
字符串只是一个元素。您想将其更改为字符数组。
foreach ($i in 'hithere') { $i }
hithere
foreach ($i in [char[]]'hithere') { $i }
h
i
t
h
e
r
e
嗯,这不太好用。这些代码点相当高,U+1F600(32位)等
foreach ($i in [char[]]'') { $i }
� # 16 bit surrogate pairs?
�
�
�
�
�
�
�
�
�
�
�
�
�
嗯好的,添加每一对。这是使用 https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates (或仅使用 ConvertToUTF32($emoji, 0) )
的另一种方法
$emojis = ''
for ($i = 0; $i -lt $emojis.length; $i += 2) {
[System.Char]::IsHighSurrogate($emojis[$i])
0x10000 + ($emojis[$i] - 0xD800) * 0x400 + $emojis[$i+1] - 0xDC00 | % tostring x
# [system.char]::ConvertToUtf32($emojis,$i) | % tostring x # or
$emojis[$i] + $emojis[$i+1]
}
True
1f600
True
1f601
True
1f602
True
1f603
True
1f604
True
1f605
True
1f606
注意Unicode.GetBytes()方法调用中的unicode指的是utf16le编码。
中文作品。
[char[]]'嗨,您好'
嗨
,
您
好
这里使用的是utf32编码。所有字符都是 4 个字节长。将每 4 个字节转换为 int32 并将它们打印为十六进制。
$emoji = ''
$utf32 = [System.Text.Encoding]::utf32.GetBytes($emoji)
for($i = 0; $i -lt $utf32.count; $i += 4) {
$int32 = [bitconverter]::ToInt32($utf32[$i..($i+3)],0)
$int32 | % tostring x
}
1f600
1f601
1f602
1f603
1f604
1f605
1f606
或者从 int32 到字符串的另一种方式。简单地将 int32 转换为 [char]
是行不通的(必须添加成对的 [char])。脚本参考:https://www.powershellgallery.com/packages/Emojis/0.1/Content/Emojis.psm1
for ($i = 0x1f600; $i -le 0x1f606; $i++ ) { [System.Char]::ConvertFromUtf32($i) }
另见 How to encode 32-bit Unicode characters in a PowerShell string literal?
编辑:
Powershell 7 有一个很好的 enumeraterunes() 方法:
$emojis = ''
$emojis.enumeraterunes() | % value | % tostring x
1f600
1f601
1f602
1f603
1f604
1f605
1f606
我有一个仅填充表情符号的文本框。没有空格或任何类型的字符。我需要拆分这些表情符号才能识别它们。这是我试过的:
function emoji_to_unicode(){
foreach ($emoji in $textbox.Text) {
$unicode = [System.Text.Encoding]::Unicode.GetBytes($emoji)
Write-Host $unicode
}
}
不是一个一个地打印字节,而是循环 运行 一次,打印所有连接在一起的表情符号的代码。就好像所有的表情符号都是一个项目。我测试了 6 个表情符号,而不是得到这个:
61 216 7 222
61 216 67 222
61 216 10 222
61 216 28 222
61 216 86 220
60 216 174 223
我明白了:
61 216 7 222 61 216 67 222 61 216 10 222 61 216 28 222 61 216 86 220 60 216 174 223
我错过了什么?
字符串只是一个元素。您想将其更改为字符数组。
foreach ($i in 'hithere') { $i }
hithere
foreach ($i in [char[]]'hithere') { $i }
h
i
t
h
e
r
e
嗯,这不太好用。这些代码点相当高,U+1F600(32位)等
foreach ($i in [char[]]'') { $i }
� # 16 bit surrogate pairs?
�
�
�
�
�
�
�
�
�
�
�
�
�
嗯好的,添加每一对。这是使用 https://en.wikipedia.org/wiki/Universal_Character_Set_characters#Surrogates (或仅使用 ConvertToUTF32($emoji, 0) )
的另一种方法$emojis = ''
for ($i = 0; $i -lt $emojis.length; $i += 2) {
[System.Char]::IsHighSurrogate($emojis[$i])
0x10000 + ($emojis[$i] - 0xD800) * 0x400 + $emojis[$i+1] - 0xDC00 | % tostring x
# [system.char]::ConvertToUtf32($emojis,$i) | % tostring x # or
$emojis[$i] + $emojis[$i+1]
}
True
1f600
True
1f601
True
1f602
True
1f603
True
1f604
True
1f605
True
1f606
注意Unicode.GetBytes()方法调用中的unicode指的是utf16le编码。
中文作品。
[char[]]'嗨,您好'
嗨
,
您
好
这里使用的是utf32编码。所有字符都是 4 个字节长。将每 4 个字节转换为 int32 并将它们打印为十六进制。
$emoji = ''
$utf32 = [System.Text.Encoding]::utf32.GetBytes($emoji)
for($i = 0; $i -lt $utf32.count; $i += 4) {
$int32 = [bitconverter]::ToInt32($utf32[$i..($i+3)],0)
$int32 | % tostring x
}
1f600
1f601
1f602
1f603
1f604
1f605
1f606
或者从 int32 到字符串的另一种方式。简单地将 int32 转换为 [char]
是行不通的(必须添加成对的 [char])。脚本参考:https://www.powershellgallery.com/packages/Emojis/0.1/Content/Emojis.psm1
for ($i = 0x1f600; $i -le 0x1f606; $i++ ) { [System.Char]::ConvertFromUtf32($i) }
另见 How to encode 32-bit Unicode characters in a PowerShell string literal?
编辑:
Powershell 7 有一个很好的 enumeraterunes() 方法:
$emojis = ''
$emojis.enumeraterunes() | % value | % tostring x
1f600
1f601
1f602
1f603
1f604
1f605
1f606