Postgres中带有表情符号的字符串长度

Length of string with emojis in Postgres

我试图确保 Postgres 中的一个列只包含一个表情符号。但是,我正在为长度限制而苦苦挣扎,因为例如

length('') -- 1
length('') -- 2
length('‍❤️‍‍') -- 8

我发现 有一些关于如何在 JS 中计算长度的指导,但它对 Postgres 没有多大用处,因为该方法使用了 Unicode regex 标志,这在 Postgres 中不可用。

我如何计算 Postgres 中的字符串长度,以便我的示例中的所有表情符号都算作长度 1?

我很乐意接受纠正,但我想你在这里运气不好。

表情符号是一头野兽,就性格而言。有几个潜在的群体,你们都需要涵盖:

  1. 单字符表情符号,例如Wrapped Gift, U+1F381。这些是表情符号,被定义为具有 Emoji Unicode 属性.
  2. 单字符表情符号,需要添加 U+FE0F 变体选择器,例如Red Heart。单独的 U+2764(心脏)就是 Unicode 所说的“不合格的表情符号”。大多数平台需要添加U+FE0F才能呈现为emoji。
  3. 多代码点表情符号。这些有 很多 不同的形状。人物 + 性别 + 头发颜色,粘在一起有或没有 U+200D,家庭,地区旗帜,...

最重要的是,官方的表情符号 列表不断增加,仅受某些平台支持。 (示例:Man Zombie: Light Skin Tone)Unicode 称它们为非 RGI,不推荐用于一般交换。

您需要决定是只支持 Unicode 认可的表情符号还是非 RGI。

如果您只需要 Unicode 表情符号,您可以再用一秒钟来模拟您的需求 table,您可以定期从官方 Unicode 数据重新创建。例如,拿这个文件:

https://github.com/unicode-org/unicodetools/blob/main/unicodetools/data/emoji/14.0/emoji-test.txt

(请注意 URL 中的“14.0”,您需要使用新的 Unicode 表情符号版本进行更新!)

获取所有带有文本“完全合格”的行,其中直到第一个冒号的所有内容,将其从十六进制代码点转换为字符串并将其提供给您的助手 table。

示例:

curl -sS https://raw.githubusercontent.com/unicode-org/unicodetools/main/unicodetools/data/emoji/14.0/emoji-test.txt | \
sed '/^\(#.*\)\?$/d' | \
sed -n '/fully-qualified/p' | \
sed 's/ *;.*//'

这会为您提供一长串十六进制格式的代码点(例如 1F9D1 200D 1F52C)。您可以在脚本中提供它们,将它们从十六进制更改为字符串,然后将它们放入一个小助手 table:

CREATE TABLE unicode_emojis (
    emoji TEXT PRIMARY KEY
);

然后在您的其他查询中确保进入原始 table 的值也在 unicode_emojis table 中。