dart - 替换 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
我怎样才能删除那些多余的斜杠?
解决方案
在 Dart 源文件的字符串文字中,\u0414
是一个表示 unicode 代码点的文字,而在从服务器返回的数据的情况下,您只是返回一个包含反斜杠、u
s 和看起来像一堆 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);
});
推荐阅读
- mysql - 使用 MySQL 分块删除
- 2sxc - 缺少可视查询选项卡
- node.js - 如何避免总是必须在 Typescript 中导入自己的代码?
- laravel - Laravel Auth role_id 会话仅覆盖此会话
- javascript - 试图访问字符串数组,说它是空的,即使它已满
- c# - 如何从 .cs 文件加载类并在代码中使用它
- firebase - Angular 5 + Firebase:命名空间“firebase.auth”没有导出成员“IdTokenResult”
- sql - 如果查询结果在 BigQuery 中没有记录,则显示默认值
- templates - Helm 图表嵌套循环
- javascript - Rails 5 / JavaScript:仅动态更新页面上已更新的记录属性