我有这个转义的字符串:
\ 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
如何删除那些多余的斜杠?
答案 0 :(得分:4)
在Dart源文件的字符串文字中,\u0414
是表示unicode代码点的文字,而对于从服务器返回的数据,您只是返回包含反斜杠的字符串{{1 }}和看起来的数字就像一堆unicode代码点文字。
理想的解决方法是让服务器返回要显示的UTF-8字符串,而不是使用需要解析的Dart字符串文字语法的字符串。为此类字符串编写适当的解析器是相当麻烦的。您可以查看Dart SDK中的unescapeCodeUnits作为示例。
解码此特定字符串的一种非常低效的方法(更不用说在实际应用中完全不安全且不安全)将是使用u
将Unicode代码点的字符串表示形式提取为十六进制以解析为int ,然后使用RegExp
。
注意:以下代码对于生产使用绝对是不安全的,并且与其他有效的Dart代码点文字(如String.fromCharCode()
)不匹配,或拒绝完全无效的文字(如{{ 1}}。
\u{1f601}