Ruby 3.3.4在macOS 14.6.1下拆分含组合emoji的字符串时出现拆分错误的问题咨询
Ruby 3.3.4在macOS 14.6.1下拆分含组合emoji的字符串时出现拆分错误的问题咨询
大家好,我在处理包含组合emoji的字符串时遇到了个棘手的问题,想跟各位请教下:
我目前用的是Ruby 3.3.4,系统是macOS 14.6.1。先给大家看下我的操作流程:在shell里定义了这样一个字符串:
$ st="02☺️4浪6拾8兩" $ echo "$st" 02☺️4浪6拾8兩
字符串显示完全正常,但当我把它传入Ruby用split("")拆分时,发现第二个emoji居然被拆成了两个独立部分:
$ echo "$st" | ruby -lne 'p $_.split("")' ["0", "", "2", "☺", "️", "4", "浪", "6", "拾", "8", "兩"]
这里的☺️明明是一个完整的emoji,结果被拆成了☺和️两个元素。我试了好几种方式:直接管道传参、读取文件内容,甚至在IRB里操作,结果全都是一样的:
$ cat wee_file 02☺️4浪6拾8兩 $ ruby -lne 'p $_.split("")' wee_file ["0", "", "2", "☺", "️", "4", "浪", "6", "拾", "8", "兩"]
irb(main):001> File.open('/tmp/wee_file').gets.split("") => ["0", "", "2", "☺", "️", "4", "浪", "6", "拾", "8", "兩"]
后来我琢磨明白原因了:Ruby的split("")是按Unicode代码点(code point)来拆分字符串的,而像☺️这类emoji其实是两个代码点的组合——基础表情☺(U+263A)加上变体选择符️(U+FE0F),所以会被拆成两个部分。但我们日常感知里的“一个字符”,其实是字形簇(grapheme cluster),也就是视觉上作为整体显示的字符单元。
那要正确拆分这类包含组合emoji的字符串,就得用Ruby专门提供的grapheme_clusters方法,它会按照字形簇来拆分:
比如在shell里执行:
$ echo "$st" | ruby -lne 'p $_.grapheme_clusters' ["0", "", "2", "☺️", "4", "浪", "6", "拾", "8", "兩"]
在IRB里操作的话:
irb(main):001> File.open('/tmp/wee_file').gets.grapheme_clusters => ["0", "", "2", "☺️", "4", "浪", "6", "拾", "8", "兩"]
这样就能得到预期的结果,把☺️作为一个完整的元素保留下来了。另外如果只是需要遍历每个字形簇,也可以用each_grapheme方法,效果是一样的。
备注:内容来源于stack exchange,提问作者dawg
相关产品推荐
相关产品推荐

