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

如何用ICU获取多码点字符的名称?含反向查询需求

多码点国旗表情符号的名称查询与反向实现方案

国旗表情的官方名称说明

绝大多数国家/地区国旗表情符号(比如🇺🇸、🇯🇵)是由两个区域指示符号组合而成的,这类组合本身没有独立的官方Unicode名称。Unicode标准里只给单个区域指示符号分配了名称(比如U+1F1FA叫"REGIONAL INDICATOR SYMBOL LETTER U"),组合后的国旗仅通过对应的ISO 3166-1 alpha-2国家代码来关联,没有单独的命名条目。

少数特殊旗帜(比如欧盟旗🇪🇺)同样是区域指示对组合,也没有单独的官方名称;只有非国家类的特殊旗帜(如奥林匹克五环🏅)是单个独立码点,拥有专属Unicode名称。

获取国旗"名称"的实用方法

既然没有官方组合名称,通常用两种方式处理:

  • 映射到ISO国家名称:把两个区域指示符号转成对应的ISO两位代码,再关联到国家/地区的官方名称。比如🇺🇸对应US,转成"United States of America"。
  • 参考第三方命名:像Emojipedia这类平台会给国旗起常用昵称,但这是非官方的,只能做展示用,不能作为标准依据。

用ICU库实现的示例(C++)

ICU是处理Unicode的常用库,能方便完成这个转换:

#include <unicode/uchar.h>
#include <unicode/locid.h>
#include <string>

std::string getFlagName(const UChar* flag, int32_t length) {
    // 先判断是不是有效的区域指示对
    if (length != 2 || !u_isUppercase(flag[0]) || !u_isUppercase(flag[1])) {
        return "";
    }
    // 把码点转成ISO两位代码
    char isoCode[3] = {
        (char)(flag[0] - 0x1F1E6 + 'A'),
        (char)(flag[1] - 0x1F1E6 + 'A'),
        '\0'
    };
    // 通过Locale获取国家名称
    icu::Locale loc("", isoCode);
    const char* name = loc.getDisplayName();
    return name ? std::string(name) : "";
}

反向实现:从名称获取国旗(类似u_charFromName())

因为没有官方的组合名称映射,反向操作需要先把名称转成ISO代码,再转成区域指示符号:

ICU库的反向示例

#include <unicode/uchar.h>
#include <unicode/locid.h>
#include <string>

bool getFlagFromName(const std::string& countryName, UChar* outFlag, int32_t& outLength) {
    // 遍历可用Locale匹配国家名称
    icu::Locale::const_iterator it = icu::Locale::getAvailableLocales();
    for (; it.hasNext();) {
        const icu::Locale& loc = it.next();
        const char* displayName = loc.getDisplayName();
        if (displayName && std::string(displayName) == countryName) {
            const char* isoCode = loc.getCountry();
            if (isoCode && strlen(isoCode) == 2) {
                // 把ISO代码转成区域指示符号
                outFlag[0] = (UChar)(isoCode[0] - 'A' + 0x1F1E6);
                outFlag[1] = (UChar)(isoCode[1] - 'A' + 0x1F1E6);
                outLength = 2;
                return true;
            }
        }
    }
    return false;
}

其他可用工具库

  • libunistring:轻量的Unicode字符串处理库,可辅助解析多码点序列,配合ISO代码映射表完成名称查询。
  • emoji-java(Java环境):直接支持国旗表情与国家名称的双向映射,不用自己处理码点转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 17:03:11