从unicode字符串获取随机表情符号/字符
我的目标是从列表中获得一个随机的表情符号,用F#表示 我从这个开始:从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
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的补充。