展示 HN: Mojibake – 一个用 C 编写的低级 Unicode 库
Unicode 17 - C11 -零依赖的 Unicode 文本处理,没有负担。Mojibake 是一个小型、快速、自包含的 Unicode 库,适用于 C11 和 C++17。运送符合标准的文本处理,而无需运行时或依赖树。标准 Unicode 17.0 运行时 无 License MIT 从这里开始 一个实用的 Unicode 工具包 Mojibake 是一个用 C11 编写的低级 Unicode 17 文本处理库,兼容 C++17。它在 MIT 许可证下发布。使用 您不需要安装任何东西。只需将两个文件 ( mojibake.c , mojibake.h ) 添加到您的 C/C++ 项目中。点击此处下载 mojibake-amalgamation-027.zip 归一化、字符计数和 NFKC 大小写折叠的示例。# include <stdio.h> # include <string.h> # include "mojibake.h" void print_string ( const char *input, size_t length) ; int main ( int argc, char * const argv[]) { const char *input = "Cafe\xCC\x81" ; size_t length = strlen (input); mjb_result result; // 归一化示例:在 NFC 中 e + ◌́ -> é (U+00E9) if (mjb_normalize(input, length, MJB_ENC_UTF_8, MJB_NORMALIZATION_NFC, MJB_ENC_UTF_8, &result) != MJB_STATUS_OK) { return 1 ; } // Cafe + ◌́ (U+0301, COMBINING ACUTE ACCENT) -> Café print_string(input, length); // Caf + é (U+00E9, LATIN SMALL LETTER E WITH ACUTE) -> Café print_string(result.output, result.output_size); const char *mojibake = "文字化け" ; length = strlen (mojibake); // 字符串长度示例:mjb_string_length 计算字符串中的字符数,而不是字节数。printf ( "\"%s\" 用 UTF-8 编码的长度为 %zu 字节,且长度为 %zu 个字符\n" , mojibake, length, mjb_string_length(mojibake, length, MJB_ENC_UTF_8)); mjb_result_free(&result); const char *case_input = "Straße" ; // NFKC 大小写折叠示例:在 NFKC 大小写折叠中,ß -> ss if (mjb_nfkc_casefold(case_input, strlen (case_input), MJB_ENC_UTF_8, MJB_ENC_UTF_8, &result) != MJB_STATUS_OK) { return 1 ; } printf ( "%s -> %.*s\n" , case_input, ( int )result.output_size, result.output); mjb_result_free(&result); return 0 ; } void print_string ( const char *input, size_t length) { for ( size_t i = 0 ; i < length; ++i) { unsigned char byte = ( unsigned char )input[i]; if (byte >= 0x21 && byte <= 0x7E ) { printf ( "%c" , byte); } else { printf ( "<%02X>" , byte); } } printf ( "\n" ); } 此输出:Cafe<CC><81> Caf<C3><A9> "文字化け" 用 UTF-8 编码的长度为 12 字节,且长度为 4 个字符 Straße -> strasse Mojibake 的目标是:小型 易于使用 快速 自包含 Mojibake 的作用:在所有现代操作系统 (Linux,macOS,FreeBSD,OpenBSD,NetBSD,Windows 10/11) 上运行 通过支持的算法通过官方 Unicode 测试套件 实现所有 Unicode 标准算法 满足所有 Unicode 一致性要求 特性亮点 所有 C 文件以及 Unicode 数据表都被拼接成一个大的文件和头文件:mojibake.c 和 mojibake.h 。零依赖。文本转换 归一化 : NFC/NFD/NFKC/NFKD ( mjb_normalize ),以标识符为导向的 NFKC 大小写折叠 ( mjb_nfkc_casefold ),以及快速检查 ( mjb_string_is_normalized ) ( UAX #15, Unicode 17.0.0 ) 大小写转换 : 大写、小写、标题大小写和带有完整特殊大小写和条件映射的大小写折叠 ( mjb_case ) 过滤 : 在归一化时剥离控制字符、空格或数字字符 ( mjb_string_filter ) 文本分析 字符数据库 : 每个 Unicode 字符数据库属性:类别、脚本和 Script_Extensions、区块、平面、数值、名称 ( mjb_codepoint_character , mjb_codepoint_script_extensions ) 分段 : 字形簇、单词、句子和换行机会 ( UAX #29, Unicode 17.0.0 , UAX #14, Unicode 17.0.0 ) 双向文本 : 完全的 Unicode 双向算法:段落解析、行重排、运行 ( UAX #9, Unicode 17.0.0 ) 表情符号 : 代码点属性、序列分析、RGI 表情符号检测 显示宽度 : 东亚宽度和终端显示宽度, 带有宽度感知的截断 ( mjb_display_width , mjb_truncate_width ) 排序和比较 排序 : Unicode 排序算法字符串比较和排序键,以移位和不可忽略模式 ( mjb_string_compare , mjb_collation_key , UTS #10, Unicode 17.0.0 ) 安全性 混淆检测 : 生成可重用的骨架并检查字符串是否在视觉上混淆 ( mjb_confusable_skeleton , mjb_string_is_confusable , UTS #39, Unicode 17.0.0 ) 标识符验证 : 解析器和编译器作者的 XID/ID 检查 ( mjb_string_is_identifier , UAX #31, Unicode 17.0.0 ) 集成 编码 : API 接受和输出 UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE 字符串,带有编码检测和转换 ( mjb_string_encoding , mjb_string_convert_encoding ) 解析和字符串功能 : 按字符迭代 ( mjb_next_character ) 和标准 C string.h 风格的辅助函数 ( mjb_string_length , 和其他) 区域 : 严格的 BCP 47 语言标签解析 ( mjb_locale_parse ) 可嵌入 : 自定义分配器 ( mjb_set_memory_functions ),构建时间 f
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡