首页 > 解决方案 > 如何在 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

标签: dartunicode

解决方案


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');

推荐阅读