簡體   English   中英

在Dart中替換雙反斜杠

[英]Replace double backslash in Dart

我有這個轉義的字符串:

\\ u0414 \\ u043B \\ u044F \\ u043F \\ u0440 \\ u043E \\ u0434 \\ u0430 \\ u0436 \\ u0438 \\ u043D \\ u0435 \\ u0434 \\ u0432 \\ u0438 \\ u0436 \\ u0438 \\ u043C \\ u043E \\ 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 \\ u043E \\ u0441 \\ u0442 \\ u0438

我如何刪除那些多余的斜杠?

在Dart源文件的字符串文字中, 是表示Unicode代碼點的文字,而對於從服務器返回的數據,您只是獲取了一個字符串,其中包含反斜杠, u和數字, 看起來像一堆unicode代碼點文字。

理想的解決方法是讓您的服務器返回要顯示的UTF-8字符串,而不是使用需要解析的Dart字符串文字語法的字符串。 為此類字符串編寫適當的解析器是相當麻煩的。 您可以查看Dart SDK中的unescapeCodeUnits作為示例。

解碼此特定字符串的一種非常低效的方法(更不用說在實際應用中完全不安全且不安全),將是使用RegExp將十六進制解析為int來提取unicode碼點的字符串表示形式,然后使用String.fromCharCode()

注意:以下代碼絕對不能用於生產環境 ,並且與其他有效的Dart代碼點文字(例如\\u{1f601}不匹配,或者拒絕完全無效的文字(例如\￿ffffff

// 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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM