dart - 如何在 Dart 中替换 unicode 转义字符
问题描述
我需要清理一个具有转义字符但不能这样做的字符串。
这是我的测试代码:
test('Replace unicode escape character', () {
String originalText = 'Jeremiah 52:1\\u201334';
String replacedText = originalText.replaceAll(r'\\', r'\');
expect(replacedText, 'Jeremiah 52:1\u201334');
});
它失败并出现错误:
Expected: 'Jeremiah 52:1–34'
Actual: 'Jeremiah 52:1\\u201334'
Which: is different.
Expected: ... miah 52:1–34
Actual: ... miah 52:1\\u201334
解决方案
Unicode 字符和转义字符的存储方式与您在编写字符串时的编写方式不同——它们被转换为它们自己的值。当您运行以下代码时,这一点很明显:
print('\\u2013'.length); // Prints: 6
print('\u2013'.length); // Prints: 1
在这里,发生的事情是:第一个存储了以下字符:'\'、'u'、'2'、'0'、'1'和'3'——而后者只存储了'-'。
\\
因此,您尝试通过用一个斜杠替换两个斜杠来更改第一个是\
行不通的,因为编译器不再转换您的 unicode 转义字符。
但这并不意味着您将无法将 unicode 代码转换为 unicode 字符。您可以使用以下代码:
final String str = 'Jeremiah 52:1\\u2013340';
final Pattern unicodePattern = new RegExp(r'\\u([0-9A-Fa-f]{4})');
final String newStr = str.replaceAllMapped(unicodePattern, (Match unicodeMatch) {
final int hexCode = int.parse(unicodeMatch.group(1), radix: 16);
final unicode = String.fromCharCode(hexCode);
return unicode;
});
print('Old string: $str');
print('New string: $newStr');
推荐阅读
- react-native - 由于依赖关系,无法升级 React-Native 项目
- reactjs - 带有参数的反应路由器给出 404 错误
- reactjs - 如何在 Next.js 中实现认证系统?
- javascript - 反应js | 在选择选项 TypeError: state.users is undefined 时得到这个
- javascript - 使用 XMLHttpRequest 时为我的故障 URL 获取 ERR_CERT_COMMON_NAME_INVALID?
- firebase - 数据库规则中随机生成的键的变量
- javascript - 从 unicode 生成表情符号然后提取 unicode 会给出不同的 unicode
- c++ - 什么是 libCDS 中最快的卡,前提是它应该能够扩展和擦除数据?
- python - Why is my Pygame sprite rotating like a collision box?
- tsql - SQL Server 在合并期间我可以将源表值存储到变量中吗