Men*_*elG 1 sorting list hebrew dart flutter
在 Dart 中,如果我有一个列表:
\nfinal myList = ['b', 'a'];\n
Run Code Online (Sandbox Code Playgroud)\n我想按字母顺序排序,我会使用:
\nmyList.sort(\n (String a, String b) => a.compareTo(b),\n );\n
Run Code Online (Sandbox Code Playgroud)\n现在的输出myList
是:
['a', 'b']\n
Run Code Online (Sandbox Code Playgroud)\n现在,这适用于英文字母表中的字母。
\n但如果我有一个希伯来语列表:
\nfinal unorderedHebAlphabet = ['\xd7\x90', '\xd7\x91'];\n
Run Code Online (Sandbox Code Playgroud)\n我无法使用上面的方法对其进行排序:
\n unorderedHebAlphabet.sort((String a, String b) =>\n a.compareTo(b))\n
Run Code Online (Sandbox Code Playgroud)\n它不排序。
\n预期输出,而不是:
\n['\xd7\x90', '\xd7\x91']\n
Run Code Online (Sandbox Code Playgroud)\n应该:
\n['\xd7\x91', '\xd7\x90']\n
Run Code Online (Sandbox Code Playgroud)\n作为参考,希伯来字母表按以下顺序排序:
\nfinal sortedHebrewAlphabet = [\n '\xd7\x90',\n '\xd7\x91',\n '\xd7\x92',\n '\xd7\x93',\n '\xd7\x94',\n '\xd7\x95',\n '\xd7\x96',\n '\xd7\x97',\n '\xd7\x98',\n '\xd7\x99',\n '\xd7\x9b',\n '\xd7\x9c',\n '\xd7\x9e',\n '\xd7\xa0',\n '\xd7\xa1',\n '\xd7\xa2',\n '\xd7\xa4',\n '\xd7\xa6',\n '\xd7\xa7',\n '\xd7\xa8',\n '\xd7\xa9',\n '\xd7\xaa',\n];\n
Run Code Online (Sandbox Code Playgroud)\n
它确实排序(按 UTF-16 代码单元),但它以一种不直观的方式显示。final unorderedHebAlphabet = [\'\xd7\x90\', \'\xd7\x91\'];
似乎是RTL解析的,所以在构造的列表中,元素0是\xd7\x90
,元素1是\xd7\x91
。这已经是所需的顺序,因此对其进行排序不会改变它。(混合 LTR 和 RTL 文本会令人困惑。)
例如:
\nimport \'package:collection/collection.dart\';\n\nvoid main() {\n var literal = [\'\xd7\x90\', \'\xd7\x91\'];\n print(literal[0]); // Prints: \xd7\x90\n print(literal[1]); // Prints: \xd7\x91\n\n const alef = \'\xd7\x90\';\n const bet = \'\xd7\x91\';\n const expectedOrder = [alef, bet];\n\n const listEquals = ListEquality<String>();\n \n print(listEquals.equals(literal..sort(), expectedOrder)); // Prints: true\n print(listEquals.equals([bet, alef]..sort(), expectedOrder)); // Prints: true\n}\n
Run Code Online (Sandbox Code Playgroud)\n如果您使用 Unicode LTR 覆盖 (U+202D) 作为输出前缀以强制将文本呈现为 LTR,您还可以观察到元素会按正确的顺序打印。比较:
\nconst ltr = \'\\u202D\';\nprint(\'$expectedOrder\');\nprint(\'$ltr$expectedOrder\');\n
Run Code Online (Sandbox Code Playgroud)\n或者您可以简单地单独打印元素:
\nexpectedOrder.forEach(print);\n
Run Code Online (Sandbox Code Playgroud)\n打印:
\n\xd7\x90\n\xd7\x91\n
Run Code Online (Sandbox Code Playgroud)\n我没有处理 RTL 文本的经验,但我可能会避免在代码中混合 LTR 和 RTL 文本,而是将它们表示为十六进制 Unicode 代码点以避免混淆。
\n 归档时间: |
|
查看次数: |
499 次 |
最近记录: |