vscode配置链接编译icu库

ubuntu环境安装icu库

sudo apt-get install libicu-dev

vscode配置tasks.json链接编译icu库

            "args": [
                "-g", // 生成调试信息, 便于GDB调试
                "${file}", // 当前打开的文件
                "-o", // 指定输出文件名
                "${fileDirname}/${fileBasenameNoExtension}.exe", // 输出文件路径
                "-licuuc", // 链接ICU的通用库
                "-licudata" // 链接ICU的数据库
            ],

icu解析emoji例程

#include <stdio.h>
#include <unicode/uchar.h>
#include <unicode/ustring.h>
#include <unicode/ustdio.h>
#include <unicode/utf8.h>

int main() {
    UErrorCode status = U_ZERO_ERROR;
    const char* src = "你好👨‍👩‍👧‍👦在😘吗"; // 一个复合 Emoji 示例,代表家庭
    UChar dest[256]; // 存储转换后的 UTF-16 字符串
    int32_t destLength;

    // 将 UTF-8 字符串转换为 UTF-16
    u_strFromUTF8(dest, 256, &destLength, src, -1, &status);
    if (U_FAILURE(status)) {
        printf("Failed to convert string from UTF-8 to UTF-16: %s\n", u_errorName(status));
        return 1;
    }

    // 遍历 UTF-16 字符串
    for (int32_t i = 0; i < destLength; ) {
        UChar32 codepoint;
        int32_t startIdx = i;
        U16_NEXT(dest, i, destLength, codepoint); // 提取一个完整的 Unicode 码点

        // 检查当前码点是否是 Emoji,并且是否是 Emoji Presentation
        if (u_hasBinaryProperty(codepoint, UCHAR_EMOJI)) {
            char buffer[256];
            int32_t endIdx = i;
            UBool isComplex = FALSE;

            // 检查后续字符,看是否存在零宽度连接符,表示这是一个复合 Emoji
            if (endIdx < destLength) {
                UChar32 nextCodepoint;
                int32_t tempIdx = endIdx;
                U16_NEXT(dest, tempIdx, destLength, nextCodepoint);
                if (nextCodepoint == 0x200D) { // 零宽度连接符
                    isComplex = TRUE;
                }
            }

            // 根据是否为复合 Emoji,采用不同方式输出
            if (isComplex) {
                // 处理复合 Emoji 的逻辑(这里简化处理,仅输出提示)
                printf("Found complex Emoji starting at U+%04X\n", codepoint);
            } else {
                // 获取单个 Emoji 的名称
                u_charName(codepoint, U_UNICODE_CHAR_NAME, buffer, sizeof(buffer), &status);
                if (U_SUCCESS(status)) {
                    printf("Found Emoji: U+%04X (%s)\n", codepoint, buffer);
                }
            }
        }
    }

    return 0;
}