Dart 替换省道中的双反斜杠

Dart 替换省道中的双反斜杠,dart,flutter,Dart,Flutter,我有一个转义字符串: \u0414\u043B\u044F\u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u043D\u0435\u0434\u0432\u0438\u0436\u0438\u043C\u043E\u0441\u0442\u0438 如果我这样做: print('\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u0430\u0436\u0438 \u043D\u0435\u0434\u0432\u04

我有一个转义字符串:

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

如果我这样做:

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\u0438


如何删除这些重新对齐的斜杠?

在Dart源文件的字符串文本中,
\u0414
是一个表示unicode代码点的文本,而对于从服务器返回的数据,您只需返回一个包含反斜杠的字符串,
u
s,和看起来像一堆unicode代码点文字的数字

理想的修复方法是让服务器返回要显示的UTF-8字符串,而不是使用Dart的字符串文本语法进行解析的字符串。为这样的字符串编写一个合适的解析器相当复杂。您可以查看Dart SDK中的示例

解码此特定字符串的一种非常低效(更不用说对现实世界的使用完全不安全)的方法是使用
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);
});

您是否尝试过:
string.replaceAll(新的RegExp(r'\\\'),'\')?这将是错误,第二个参数转义',或者,由于格式似乎合适,也可以使用
jsonDecode
\u0014
转换为字符。它必须位于JSON字符串文本中,因此可能:
var realString=jsonDecode(“${badString.replaceAll(r“\\”,r“\”)}”)。来自@cbracken的代码工作正常,谢谢。只有一个小问题-你能提供一些关于比赛组的链接吗?有关比赛组的详细信息,请参阅API文档。我要再次指出,上面的代码不是生产安全的,或者根本不起作用。正如@lrn所指出的,从性能和正确性的角度来看,使用我没有想到的
jsonDecode
,可能是一个更好的主意。