C++ Builder 11中十六进制字符串转UTF-8而非UTF-16的实现问题
问题原因分析
- 核心混淆:你输入的
D985是阿拉伯字母م的UTF-8编码字节的十六进制表示,不是Unicode码点值。م的Unicode码点为U+0645,对应的UTF-8编码是两个字节0xD9、0x85,拼接后十六进制就是D985。你原有代码把D985当成单个Unicode码点转换,自然得到错误字符。 - C++ Builder内置类型特性:默认
String是UTF-16编码的UnicodeString,直接存入UTF-8字节流会导致显示乱码。
修正后实现代码
// 输入的十六进制UTF-8字符串 String hexStr = _D("D985"); UTF8String utf8Str; // 每两位处理一个十六进制字节 for (int i = 1; i < hexStr.Length(); i += 2) { // 截取两位十六进制字符,转成字节值 String byteHex = hexStr.SubString(i, 2); unsigned char byte = (unsigned char)strtol(byteHex.c_str(), nullptr, 16); utf8Str += byte; } // 最终结果:UTF8String转成系统识别的UnicodeString即可正常显示 String result = utf8Str; // 此时result的值就是正确的阿拉伯字母م
补充说明
- 如果你后续需要处理的是4位的Unicode码点十六进制值,再用你原有逻辑转码点后赋值即可,注意区分输入是码点还是UTF-8字节的十六进制。
- 不需要额外设置全局locale,C++ Builder的字符串类型内置编码转换能力,直接用
UTF8String和UnicodeString的互转就足够稳定。
内容的提问来源于stack exchange,提问作者Ramez Abiad
相关产品推荐
相关产品推荐

