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
相关产品推荐
相关产品推荐

