Dart中如何将原生字符串转换为HTML格式字符串?
解决原生字符串转HTML UTF-8实体编码问题
你提到的htmlEscape和Uri.dataFromString无效的原因是它们的设计目标和你的需求不匹配:
htmlEscape默认仅转义HTML特殊字符(<、>、&、"、'),不会处理中文这类Unicode字符;Uri.dataFromString用于生成Data URI的编码,和HTML实体编码完全是两回事。
自定义转换函数实现需求
你可以通过遍历字符串的Unicode码点,手动将非ASCII字符(或指定范围的字符)转换为&#x开头的十六进制HTML实体。以下是Dart语言的实现示例:
转换所有非ASCII字符
String convertToHtmlEntity(String input) { final buffer = StringBuffer(); for (final rune in input.runes) { if (rune > 127) { // 将Unicode码点转为4位十六进制,拼接HTML实体格式 buffer.write('&#x${rune.toRadixString(16).padLeft(4, '0')};'); } else { // ASCII字符直接保留 buffer.writeCharCode(rune); } } return buffer.toString(); } // 测试示例 void main() { const original = 'QQ登录'; final result = convertToHtmlEntity(original); print(result); // 输出: QQ登录 }
仅转换中文汉字
如果只需要转换中文(而非所有非ASCII字符),可以调整判断条件,限定Unicode范围(中文汉字的Unicode区间为0x4E00到0x9FA5):
String convertChineseToHtmlEntity(String input) { final buffer = StringBuffer(); for (final rune in input.runes) { if (rune >= 0x4E00 && rune <= 0x9FA5) { buffer.write('&#x${rune.toRadixString(16).padLeft(4, '0')};'); } else { buffer.writeCharCode(rune); } } return buffer.toString(); }
说明
- 上述代码通过遍历字符串的
runes(对应Unicode码点),确保正确处理多字节字符; toRadixString(16)将码点转为十六进制字符串,padLeft(4, '0')保证输出为4位格式(符合HTML实体的常见写法);- 你可以根据需求修改判断条件,实现更精准的字符转换控制。
内容的提问来源于stack exchange,提问作者ming ming
相关产品推荐
相关产品推荐

