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

如何在Zig语言中忽略大小写比较两个UTF-8字符串?

Zig中实现忽略大小写的UTF-8字符串比较

要实现忽略大小写的UTF-8字符串比较,不能直接用std.mem.eql(它仅做字节级精确匹配),需要基于Unicode码点进行大小写转换后逐个对比。以下是具体实现方案:

核心思路

借助Zig标准库的std.unicode模块,遍历两个字符串的每个Unicode码点,将其统一转换为小写(或大写)后逐一比较,同时确保两个字符串的码点数量一致。

实现代码

const std = @import("std");
const unicode = std.unicode;

/// 忽略大小写比较两个UTF-8字符串,支持任意合法UTF-8字符
fn eqlIgnoreCase(a: []const u8, b: []const u8) bool {
    var it_a = unicode.Utf8Iterator{ .bytes = a };
    var it_b = unicode.Utf8Iterator{ .bytes = b };

    while (true) {
        // 逐个获取码点,若解码失败(非法UTF-8)则判定不相等
        const cp_a = it_a.nextCodepoint() catch return false;
        const cp_b = it_b.nextCodepoint() catch return false;

        // 两个字符串都遍历完则相等
        if (cp_a == null and cp_b == null) return true;
        // 一个遍历完另一个没遍历完则不相等
        if (cp_a == null or cp_b == null) return false;

        // 转换为小写后比较
        const lower_a = unicode.toLower(cp_a.?);
        const lower_b = unicode.toLower(cp_b.?);
        if (lower_a != lower_b) return false;
    }
}

pub fn main() !void {
    // 测试基本大小写场景
    const a = "Zig";
    const b = "zig";
    std.debug.print("is_equal: {}\n", .{eqlIgnoreCase(a, b)}); // 输出: is_equal: true

    // 测试UTF-8特殊字符场景
    const c = "Grüße";
    const d = "GRÜSSE";
    std.debug.print("c == d (ignore case): {}\n", .{eqlIgnoreCase(c, d)}); // 输出: c == d (ignore case): true
}

关键细节说明

  • UTF-8安全:使用unicode.Utf8Iterator遍历码点,避免直接操作字节破坏多字节UTF-8字符的结构。
  • 错误处理:若任一字符串包含非法UTF-8序列,函数直接返回false(可根据需求调整错误处理逻辑)。
  • Unicode兼容性:unicode.toLower遵循Unicode大小写映射规则,支持绝大多数语言的字符转换。

内容的提问来源于stack exchange,提问作者B Shyam Sundar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:43:20