如何在 Dart 中根据希伯来语按字母顺序对列表进行排序?

Men*_*elG 1 sorting list hebrew dart flutter

语境

\n

在 Dart 中,如果我有一个列表:

\n
final myList = ['b', 'a'];\n
Run Code Online (Sandbox Code Playgroud)\n

我想按字母顺序排序,我会使用:

\n
myList.sort(\n      (String a, String b) => a.compareTo(b),\n    );\n
Run Code Online (Sandbox Code Playgroud)\n

现在的输出myList是:

\n
['a', 'b']\n
Run Code Online (Sandbox Code Playgroud)\n

现在,这适用于英文字母表中的字母。

\n

问题

\n

但如果我有一个希伯来语列表:

\n
final 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
    \n
  • 如何按希伯来语字母顺序对列表进行排序?
  • \n
\n

笔记

\n

作为参考,希伯来字母表按以下顺序排序:

\n
final 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

jam*_*lin 5

确实排序(按 UTF-16 代码单元),但它以一种不直观的方式显示。final unorderedHebAlphabet = [\'\xd7\x90\', \'\xd7\x91\'];似乎是RTL解析的,所以在构造的列表中,元素0是\xd7\x90,元素1是\xd7\x91。这已经是所需的顺序,因此对其进行排序不会改变它。(混合 LTR 和 RTL 文本会令人困惑。)

\n

例如:

\n
import \'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,您还可以观察到元素会按正确的顺序打印。比较:

\n
const ltr = \'\\u202D\';\nprint(\'$expectedOrder\');\nprint(\'$ltr$expectedOrder\');\n
Run Code Online (Sandbox Code Playgroud)\n

或者您可以简单地单独打印元素:

\n
expectedOrder.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