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

Dart/Flutter中如何将'Hello👋'转换为指定十六进制值?

解决字符串'Hello👋'转正确十六进制的问题

错误原因分析

你得到的错误结果48656c6c6f3d4b,前半部分对应Hello的正确十六进制,但后半部分错误。这是因为你直接将字符串的UTF-16 codeUnits(即[72, 101, 108, 108, 111, 55357, 56395])传入了转换库,而没有先将字符串编码为UTF-8字节序列。

其中表情👋的UTF-16是代理对0xD83D(55357)和0xDC4B(56395),但它的UTF-8编码是4个字节:0xF0 0x9F 0x91 0x8B,对应十六进制f09f918b,这才是期望结果的后半部分。

正确实现方法

方法1:原生JavaScript(无需第三方库)

直接利用TextEncoder将字符串转为UTF-8字节数组,再逐个转换为十六进制:

function strToUtf8Hex(str) {
  const utf8Bytes = new TextEncoder().encode(str);
  return Array.from(utf8Bytes, byte => byte.toString(16).padStart(2, '0')).join('');
}

// 测试
console.log(strToUtf8Hex('Hello👋')); // 输出:48656c6c6ff09f918b

方法2:使用第三方库(以hex库为例)

先将字符串转为UTF-8字节数组,再传入库进行编码:

const hex = require('hex');

const utf8Bytes = new TextEncoder().encode('Hello👋');
const result = hex.encode(utf8Bytes);
console.log(result); // 输出正确结果

关键注意点

  • 所有转换必须基于UTF-8字节序列,而非UTF-16的codeUnits
  • 若使用Pinenacl,同样需要先获取字符串的UTF-8字节数组,再调用其十六进制编码方法,避免直接传入字符串或UTF-16单元。

内容的提问来源于stack exchange,提问作者redDwarf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:39:32