You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel中正确计算Unicode字符串的Grapheme长度?

Excel中Unicode视觉字符(Grapheme)数量计算方案

Excel内置的LEN/LENB、MID/MIDB函数无法准确统计包含emoji、组合字符(如🤷‍♂️、🤦🏻‍♂️)的视觉字符(Grapheme Cluster)数量,比如LENB("^🚀^")返回4而非预期的3,MID("^🚀🌍^",2,2)也无法得到正确结果。以下是几种更优解法:

一、自定义VBA函数(兼容性最强)

这是最稳定的解决方案,支持所有Excel版本,能正确处理各类组合字符、emoji:

  1. 按Alt+F11打开VBA编辑器,插入新模块
  2. 粘贴以下代码:
Function GraphemeCount(ByVal inputStr As String) As Long
    Dim i As Long, count As Long
    count = 0
    i = 1
    Do While i <= Len(inputStr)
        count = count + 1
        ' 处理双码点代理对(如普通emoji)
        If i < Len(inputStr) Then
            Dim charCode As Long
            charCode = AscW(Mid(inputStr, i, 1))
            ' 高代理字符范围:&HD800 到 &HDBFF
            If charCode >= &HD800 And charCode <= &HDBFF Then
                i = i + 2
                GoTo NextIteration
            End If
            ' 处理组合标记(如肤色修饰、音标等)
            Dim nextCharCode As Long
            nextCharCode = AscW(Mid(inputStr, i + 1, 1))
            If (nextCharCode >= &H0300 And nextCharCode <= &H036F) Or _
               (nextCharCode >= &H1AB0 And nextCharCode <= &H1AFF) Or _
               (nextCharCode >= &H1DC0 And nextCharCode <= &H1DFF) Or _
               (nextCharCode >= &H20D0 And nextCharCode <= &H20FF) Or _
               (nextCharCode >= &HFE20 And nextCharCode <= &HFE2F) Then
                i = i + 2
                GoTo NextIteration
            End If
        End If
        i = i + 1
NextIteration:
    Loop
    GraphemeCount = count
End Function
  1. 返回Excel,直接在单元格中使用=GraphemeCount(A1)即可统计A1单元格的视觉字符数量。

二、Excel 365/2021动态数组解法(无需VBA)

利用动态数组函数实现纯公式解法,适合不想启用宏的场景:

=SUM(--(NOT(ISNUMBER(XMATCH(UNICODE(MID(A1,SEQUENCE(LEN(A1)),1)),{&H300,&H301,&H302,&H303,&H304,&H305,&H306,&H307,&H308,&H309,&H30A,&H30B,&H30C,&H30D,&H30E,&H30F,&H310,&H311,&H312,&H313,&H314,&H315,&H316,&H317,&H318,&H319,&H31A,&H31B,&H31C,&H31D,&H31E,&H31F,&H320,&H321,&H322,&H323,&H324,&H325,&H326,&H327,&H328,&H329,&H32A,&H32B,&H32C,&H32D,&H32E,&H32F,&H330,&H331,&H332,&H333,&H334,&H335,&H336,&H337,&H338,&H339,&H33A,&H33B,&H33C,&H33D,&H33E,&H33F,&H1AB0,&H1AB1,&H1AB2,&H1AB3,&H1AB4,&H1AB5,&H1AB6,&H1AB7,&H1AB8,&H1AB9,&H1ABA,&H1ABB,&H1ABC,&H1ABD,&H1ABE,&H1ABF,&H1AC0,&H1AC1,&H1AC2,&H1AC3,&H1AC4,&H1AC5,&H1AC6,&H1AC7,&H1AC8,&H1AC9,&H1ACA,&H1ACB,&H1ACC,&H1ACD,&H1ACE,&H1ACF,&H1AD0,&H1AD1,&H1AD2,&H1AD3,&H1AD4,&H1AD5,&H1AD6,&H1AD7,&H1AD8,&H1AD9,&H1ADA,&H1ADB,&H1ADC,&H1ADD,&H1ADE,&H1ADF,&H1AE0,&H1AE1,&H1AE2,&H1AE3,&H1AE4,&H1AE5,&H1AE6,&H1AE7,&H1AE8,&H1AE9,&H1AEA,&H1AEB,&H1AEC,&H1AED,&H1AEE,&H1AEF,&H1AF0,&H1AF1,&H1AF2,&H1AF3,&H1AF4,&H1AF5,&H1AF6,&H1AF7,&H1AF8,&H1AF9,&H1AFA,&H1AFB,&H1AFC,&H1AFD,&H1AFE,&H1AFF,&H1DC0,&H1DC1,&H1DC2,&H1DC3,&H1DC4,&H1DC5,&H1DC6,&H1DC7,&H1DC8,&H1DC9,&H1DCA,&H1DCB,&H1DCC,&H1DCD,&H1DCE,&H1DCF,&H1DD0,&H1DD1,&H1DD2,&H1DD3,&H1DD4,&H1DD5,&H1DD6,&H1DD7,&H1DD8,&H1DD9,&H1DDA,&H1DDB,&H1DDC,&H1DDD,&H1DDE,&H1DDF,&H1DE0,&H1DE1,&H1DE2,&H1DE3,&H1DE4,&H1DE5,&H1DE6,&H1DE7,&H1DE8,&H1DE9,&H1DEA,&H1DEB,&H1DEC,&H1DED,&H1DEE,&H1DEF,&H1DF0,&H1DF1,&H1DF2,&H1DF3,&H1DF4,&H1DF5,&H1DF6,&H1DF7,&H1DF8,&H1DF9,&H1DFA,&H1DFB,&H1DFC,&H1DFD,&H1DFE,&H1DFF,&H20D0,&H20D1,&H20D2,&H20D3,&H20D4,&H20D5,&H20D6,&H20D7,&H20D8,&H20D9,&H20DA,&H20DB,&H20DC,&H20DD,&H20DE,&H20DF,&H20E0,&H20E1,&H20E2,&H20E3,&H20E4,&H20E5,&H20E6,&H20E7,&H20E8,&H20E9,&H20EA,&H20EB,&H20EC,&H20ED,&H20EE,&H20EF,&H20F0,&H20F1,&H20F2,&H20F3,&H20F4,&H20F5,&H20F6,&H20F7,&H20F8,&H20F9,&H20FA,&H20FB,&H20FC,&H20FD,&H20FE,&H20FF,&HFE20,&HFE21,&HFE22,&HFE23,&HFE24,&HFE25,&HFE26,&HFE27,&HFE28,&HFE29,&HFE2A,&HFE2B,&HFE2C,&HFE2D,&HFE2E,&HFE2F}))))+(LEN(A1)-LEN(TEXTJOIN("",TRUE,MID(A1,SEQUENCE(LEN(A1)),1)*(NOT(ISNUMBER(XMATCH(UNICODE(MID(A1,SEQUENCE(LEN(A1)),1)),{&HD800,&HD801,&HD802,&HD803,&HD804,&HD805,&HD806,&HD807,&HD808,&HD809,&HD80A,&HD80B,&HD80C,&HD80D,&HD80E,&HD80F,&HD810,&HD811,&HD812,&HD813,&HD814,&HD815,&HD816,&HD817,&HD818,&HD819,&HD81A,&HD81B,&HD81C,&HD81D,&HD81E,&HD81F,&HD820,&HD821,&HD822,&HD823,&HD824,&HD825,&HD826,&HD827,&HD828,&HD829,&HD82A,&HD82B,&HD82C,&HD82D,&HD82E,&HD82F,&HD830,&HD831,&HD832,&HD833,&HD834,&HD835,&HD836,&HD837,&HD838,&HD839,&HD83A,&HD83B,&HD83C,&HD83D,&HD83E,&HD83F,&HD840,&HD841,&HD842,&HD843,&HD844,&HD845,&HD846,&HD847,&HD848,&HD849,&HD84A,&HD84B,&HD84C,&HD84D,&HD84E,&HD84F,&HD850,&HD851,&HD852,&HD853,&HD854,&HD855,&HD856,&HD857,&HD858,&HD859,&HD85A,&HD85B,&HD85C,&HD85D,&HD85E,&HD85F,&HD860,&HD861,&HD862,&HD863,&HD864,&HD865,&HD866,&HD867,&HD868,&HD869,&HD86A,&HD86B,&HD86C,&HD86D,&HD86E,&HD86F,&HD870,&HD871,&HD872,&HD873,&HD874,&HD875,&HD876,&HD877,&HD878,&HD879,&HD87A,&HD87B,&HD87C,&HD87D,&HD87E,&HD87F,&HD880,&HD881,&HD882,&HD883,&HD884,&HD885,&HD886,&HD887,&HD888,&HD889,&HD88A,&HD88B,&HD88C,&HD88D,&HD88E,&HD88F,&HD890,&HD891,&HD892,&HD893,&HD894,&HD895,&HD896,&HD897,&HD898,&HD899,&HD89A,&HD89B,&HD89C,&HD89D,&HD89E,&HD89F,&HD8A0,&HD8A1,&HD8A2,&HD8A3,&HD8A4,&HD8A5,&HD8A6,&HD8A7,&HD8A8,&HD8A9,&HD8AA,&HD8AB,&HD8AC,&HD8AD,&HD8AE,&HD8AF,&HD8B0,&HD8B1,&HD8B2,&HD8B3,&HD8B4,&HD8B5,&HD8B6,&HD8B7,&HD8B8,&HD8B9,&HD8BA,&HD8BB,&HD8BC,&HD8BD,&HD8BE,&HD8BF,&HD8C0,&HD8C1,&HD8C2,&HD8C3,&HD8C4,&HD8C5,&HD8C6,&HD8C7,&HD8C8,&HD8C9,&HD8CA,&HD8CB,&HD8CC,&HD8CD,&HD8CE,&HD8CF,&HD8D0,&HD8D1,&HD8D2,&HD8D3,&HD8D4,&HD8D5,&HD8D6,&HD8D7,&HD8D8,&HD8D9,&HD8DA,&HD8DB,&HD8DC,&HD8DD,&HD8DE,&HD8DF,&HD8E0,&HD8E1,&HD8E2,&HD8E3,&HD8E4,&HD8E5,&HD8E6,&HD8E7,&HD8E8,&HD8E9,&HD8EA,&HD8EB,&HD8EC,&HD8ED,&HD8EE,&HD8EF,&HD8F0,&HD8F1,&HD8F2,&HD8F3,&HD8F4,&HD8F5,&HD8F6,&HD8F7,&HD8F8,&HD8F9,&HD8FA,&HD8FB,&HD8FC,&HD8FD,&HD8FE,&HD8FF}))))/2

公式原理:

  • 第一部分统计非组合标记的字符数量
  • 第二部分统计双码点代理对的数量,每两个码点合并为一个视觉字符
  • 两部分相加得到最终的视觉字符数

三、为什么内置函数失效

  • LEN统计的是Unicode码点数量,双码点emoji(如🚀)会被算成2,组合emoji(如🤷‍♂️)会被算成3,和视觉字符数不符
  • LENB统计的是UTF-16编码字节数,每个码点占2字节,自然无法对应视觉字符数
  • 你之前尝试的简化公式=1-SUM(-(LEFT(A1,SEQUENCE(LEN(A1)))<>A1))仅判断前缀是否等于原字符串,无法处理中间的组合字符和代理对,因此结果错误

内容的提问来源于stack exchange,提问作者Florin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:27:01