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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:15:04