如何使用ICU库正确处理包含NBSP的C++字符串修剪?
解决ICU UnicodeString::trim()无法修剪NBSP的问题
ICU的UnicodeString::trim()默认仅修剪U+0020 普通空格,NBSP(U+00A0 非断空格)虽属Unicode标准,但不在默认修剪字符集合内,因此会被忽略。无需完全自行实现修剪逻辑,通过ICU提供的重载接口即可解决:
方案1:指定要修剪的特定空白字符
如果仅需处理普通空格和NBSP,直接定义包含这两个字符的集合传入trim():
std::string trim(const std::string &input) { icu::UnicodeString unicodeString = icu::UnicodeString::fromUTF8(input); // 包含普通空格(U+0020)和NBSP(U+00A0)的修剪字符数组 const UChar trimChars[] = {' ', 0xA0, 0}; unicodeString.trim(trimChars); std::string result; unicodeString.toUTF8String(result); return result; }
方案2:修剪所有Unicode标准空白字符
如果需要覆盖所有Unicode定义的空白字符(比如全角空格、窄NBSP、数字空格等),可利用ICU的u_isWhitespace()函数判断空白属性,结合trim()的函数重载:
#include <unicode/uscript.h> // 判断是否为Unicode空白字符的辅助函数 bool isWhitespace(UChar32 c) { return u_isWhitespace(c); } std::string trim(const std::string &input) { icu::UnicodeString unicodeString = icu::UnicodeString::fromUTF8(input); // 传入自定义判断函数,修剪所有Unicode空白 unicodeString.trim(isWhitespace); std::string result; unicodeString.toUTF8String(result); return result; }
方案2通用性更强,能处理所有符合Unicode标准的空白类字符,适合需要全面处理文本空白的场景。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

