首页 > 解决方案 > 替换 Dart 中的双反斜杠

问题描述

我有这个转义字符串:

\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442

如果我做:

print('\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u0438');

控制台会告诉我:

Для продажи недвижимости

但是,如果我从服务器中逃脱了 2 次字符串:

\\u0414\\u043B\\u044F \\u043F\\u0440\\u043E\\u0434\\u0430\\u0436\\u0438 \\u043D\\u0435\\u0434\\u0432\\u0438\\u0436\\ u0438\\u043C\\u043E\\u0441\\u0442\\u0438

并做一些替换工作:

var result = string.replaceAll(new RegExp(r'\\'), r'\');

编译器不会解码这些字符并且会显示相同的转义字符串:

print(result);

安慰:

\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442

我怎样才能删除那些多余的斜杠?

标签: dartflutter

解决方案


在 Dart 源文件的字符串文字中,\u0414是一个表示 unicode 代码点的文字,而在从服务器返回的数据的情况下,您只是返回一个包含反斜杠、us 和看起来像一堆 unicode 的数字的字符串代码点文字。

理想的解决方法是让您的服务器返回您想要显示的 UTF-8 字符串,而不是使用您需要解析的 Dart 字符串文字语法的字符串。为此类字符串编写适当的解析器相当复杂。您可以查看Dart SDK 中的unescapeCodeUnits作为示例。

解码这个特定字符串的一种非常低效(更不用说在实际使用中完全不安全和不安全)的方法是提取 unicode 代码点的字符串表示,RegExp并将十六进制解析为 int,然后使用String.fromCharCode().

注意:以下代码对于生产使用绝对不安全,并且不匹配其他有效的 Dart 代码点文字,例如\u{1f601},或拒绝完全无效的文字,例如\uffffffffff.

// Match \u0123 substrings (note this will match invalid codepoints such as \u123456789).
final RegExp r = RegExp(r'\\\\u([0-9a-fA-F]+)');

// Sample string to parse.
final String source = r'\\u0414\\u043B\\u044F \\u043F\\u0440\\u043E\\u0434\\u0430\\u0436\\u0438 \\u043D\\u0435\\u0434\\u0432\\u0438\\u0436\\u0438\\u043C\\u043E\\u0441\\u0442\\u0438';

// Replace each \u0123 with the decoded codepoint.
final String decoded = source.replaceAllMapped(r, (Match m) {
  // Extract the parenthesised hex string. '\\u0123' -> '123'.
  final String hexString = m.group(1);

  // Parse the hex string to an int.
  final int codepoint = int.parse(hexString, radix: 16);

  // Convert codepoint to string.
  return String.fromCharCode(codepoint);
});

推荐阅读