从unicode字符串获取随机表情符号/字符

从unicode字符串获取随机表情符号/字符,unicode,f#,Unicode,F#,我的目标是从列表中获得一个随机的表情符号,用F#表示 我从这个开始: let pickOne (icons: string) : char = icons.[Helpers.random.Next(icons.Length)] let happySymbols = "All strings in .NET are 16-bit unicode strings. That's the definition of char: Represents a character as a UTF-1

我的目标是从列表中获得一个随机的表情符号,用F#表示

我从这个开始:

let pickOne (icons: string) : char = icons.[Helpers.random.Next(icons.Length)]
let happySymbols = "All strings in .NET are 16-bit unicode strings.
That's the definition of 
char
:

Represents a character as a UTF-16 code unit.

All characters take up the minimum encoding size (2 bytes for UTF-16), up to as many bytes as required. Emojis don't fit in 2 bytes, so they align to 4 bytes, or 2 chars.

So what's the solution? align(4) all the things! (insert GCC joke here).

First we convert everything into
UTF32
:

let utf32 (source: string) =
    Encoding.Convert(Encoding.Unicode, Encoding.UTF32, Encoding.Unicode.GetBytes(source))
let pickOne(icons:string):char=icons。[Helpers.random.Next(icons.Length)]

让happySymbols=“在.NET中的所有字符串都是16位unicode字符串。 这就是
char
的定义:

将字符表示为UTF-16代码单元

所有字符都采用最小编码大小(UTF-16为2字节),最多为所需的字节数。Emojis不能容纳2个字节,因此它们将对齐为4个字节或2个字符

那么解决方案是什么呢?对齐(4)所有内容!(在此处插入GCC笑话)

首先,我们将所有内容转换为
UTF32

let pick (arr: byte[]) index = 
    Encoding.UTF32.GetString(arr, index * 4, 4)
然后我们可以选择任何“角色”:

测试:


let happySymbols=“Asti的回答符合你的目的,但我对我们在这方面的进展不太满意。我想我被答案中的“适当”这个词给挂断了。在各地进行了大量的研究之后,我对这种方法产生了好奇,这又让我找到了这种类型。该类型的文档特别有助于正确处理字符串,以及.NET中Unicode UTF-8字符串的内容。我也在LINQPad做了实验,得到了这个

let dump x=x.dump()

让runes=“abcABCæåÆØØ”尝试用双引号替换单引号。你会得到一个表情符号的字符串数组。是的,这是我在问题的最后一行中写的;我知道我可以创建一个字符串数组,但我的问题是,如果你使用图标,它为什么不适用于charsIt。Substring(2,2)对于第二个图标。@BentTranberg,如果混合中有任何非表情符号,它将不起作用。我知道。这就是为什么我不想在此基础上给出答案。嘿@Thomas,这是。我不知道符文类型,但看起来这可能是一种方式,因为在我这边,实现应该知道每个符号的大小,等等。我明天将对此进行实验!这是一个很好的发现!似乎是对.NETCore3.0的补充。