我需要清理具有转义字符的字符串,但无法这样做。
\n这是我的测试代码:
\ntest(\'Replace unicode escape character\', () {\n String originalText = \'Jeremiah 52:1\\\\u201334\';\n String replacedText = originalText.replaceAll(r\'\\\\\', r\'\\\');\n expect(replacedText, \'Jeremiah 52:1\\u201334\');\n });\n
Run Code Online (Sandbox Code Playgroud)\n它失败并出现错误:
\nExpected: \'Jeremiah 52:1\xe2\x80\x9334\'\n Actual: \'Jeremiah 52:1\\\\u201334\'\n Which: is different.\n Expected: ... miah 52:1\xe2\x80\x9334\n Actual: ... miah 52:1\\\\u201334\n
Run Code Online (Sandbox Code Playgroud)\n
Unicode 字符和转义字符不会按照您在编写字符串时编写的方式存储 - 它们会转换为自己的值。当您运行以下代码时,这一点很明显:
\nprint('\\\\u2013'.length); // Prints: 6\nprint('\\u2013'.length); // Prints: 1\n
Run Code Online (Sandbox Code Playgroud)\n在这里,发生的情况是:第一个存储了以下字符:“\\”、“u”、“2”、“0”、“1”和“3”——而后者存储了“\xe2\x80\”仅限 x93'。
\n\\\\
因此,您尝试通过用一个斜杠替换两个斜杠来更改第一个斜杠的尝试\\
将不起作用,因为编译器不再转换您的 unicode 转义字符。
但这并不意味着您无法将 unicode 代码转换为 unicode 字符。您可以使用以下代码:
\nfinal String str = 'Jeremiah 52:1\\\\u2013340';\nfinal Pattern unicodePattern = new RegExp(r'\\\\u([0-9A-Fa-f]{4})');\nfinal String newStr = str.replaceAllMapped(unicodePattern, (Match unicodeMatch) {\n final int hexCode = int.parse(unicodeMatch.group(1), radix: 16);\n final unicode = String.fromCharCode(hexCode);\n return unicode;\n});\nprint('Old string: $str');\nprint('New string: $newStr');\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
2896 次 |
最近记录: |