如何在Dart/Flutter中将花式Unicode文本转换为常规文本?
在Dart/Flutter中转换花式Unicode文本为常规文本
要将各类花式Unicode文本转换为常规文本,核心思路是把不同风格的字符变体映射回对应的基础ASCII字符,结合Unicode规范化处理。以下是一个直接可行的实现方案:
自定义映射转换函数
通过建立花式字符到常规字符的映射表,遍历输入字符串进行替换,最后做Unicode规范化处理:
String convertFancyToNormal(String input) { // 映射各类常见花式字符到常规字符,可根据需求扩展 final charMap = <String, String>{ // 数学斜体 '𝑻': 'T', '𝒉': 'h', '𝒆': 'e', '𝒒': 'q', '𝒖': 'u', '𝒊': 'i', '𝒄': 'c', '𝒌': 'k', '𝒃': 'b', '𝒓': 'r', '𝒐': 'o', '𝒘': 'w', '𝒏': 'n', '𝒇': 'f', '𝒙': 'x', '𝒋': 'j', '𝒎': 'm', '𝒑': 'p', '𝒍': 'l', '𝒛': 'z', '𝒚': 'y', '𝒅': 'd', '𝒈': 'g', // 粗体变体 '𝗧': 'T', '𝗵': 'h', '𝗲': 'e', '𝗤': 'Q', '𝗨': 'U', '𝗜': 'I', '𝗖': 'C', '𝗞': 'K', '𝗕': 'B', '𝗥': 'R', '𝗢': 'O', '𝗪': 'W', '𝗡': 'N', '𝗙': 'F', '𝗫': 'X', '𝗝': 'J', '𝗠': 'M', '𝗣': 'P', '𝗘': 'E', '𝗗': 'D', '𝗟': 'L', '𝗔': 'A', '𝗭': 'Z', '𝗬': 'Y', '𝗗': 'D', '𝗢': 'O', '𝗚': 'G', // 等宽粗体 'B': 'B', 'r': 'r', 'o': 'o', 'w': 'w', 'n': 'n', // 手写/哥特体 '𝔗': 'T', '𝔥': 'h', '𝔢': 'e', '𝔔': 'Q', '𝔲': 'u', '𝔦': 'i', '𝔠': 'c', '𝔨': 'k', '𝔅': 'B', '𝔯': 'r', '𝔬': 'o', '𝔴': 'w', '𝔫': 'n', '𝔉': 'F', '𝔬': 'o', '𝔵': 'x', '𝔍': 'J', '𝔪': 'm', '𝔭': 'p', '𝔡': 'd', '𝔏': 'L', '𝔞': 'a', '𝔷': 'z', '𝔶': 'y', '𝔇': 'D', '𝔤': 'g', // 圈形字符 '🅵': 'F', '🅾': 'O', '🆇': 'X', 'ⓞ': 'o', 'ⓥ': 'v', 'ⓔ': 'e', 'ⓡ': 'r', // 反向字符 'ʇ': 't', 'ɥ': 'h', 'ǝ': 'e', }; String result = ''; for (final char in input.characters) { result += charMap[char] ?? char; } // 处理Unicode组合字符,确保文本完全规范化 return result.normalize(NFC); }
使用示例
void main() { final fancyText = '𝑻𝒉𝒆 ℚ𝕦𝕚𝕔𝕜 Brown 🅵🅾🆇 𝔍𝔲𝔪𝔭𝔢𝔡 ⓞⓥⓔⓡ ʇɥǝ 𝗟𝗮𝘇𝘆 𝙳𝚘𝚐'; final normalText = convertFancyToNormal(fancyText); print(normalText); // 输出: The Quick Brown Fox Jumped over the Lazy Dog }
扩展说明
- 若需要处理更多罕见的花式字符变体,可以继续扩展
charMap的映射条目。 - 对于更复杂的Unicode字符(如带修饰符的组合字符),
normalize(NFC)可以将其合并为标准形式,避免残留异常字符。
内容的提问来源于stack exchange,提问作者SirOllepopple
相关产品推荐
相关产品推荐

