代码之家  ›  专栏  ›  技术社区  ›  FetFrumos

flutter-无法识别unicode字符串(使用Runes)

  •  0
  • FetFrumos  · 技术社区  · 4 年前

    我需要清理一个有转义符但无法清理的字符串。

    以下是我的测试代码:

    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
    
    0 回复  |  直到 4 年前
        1
  •  6
  •   KapilDev Neupane    4 年前

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