【发布时间】:2018-05-14 07:57:38
【问题描述】:
我有一个发出街道名称列表的 Java 程序。名称应不区分大小写排序。消费者是一个 C# 应用程序,它使用列表进行二分搜索算法,因此它必须使用完全相同的顺序。
确切的排序方式不是很重要,尽管按字母顺序和可能(德语)-区域设置依赖会很好。
我未能在两个平台之间找到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止,我得到的最好结果是:
- java:
String.CASE_INSENSITIVE_ORDER - .NET:
StringComparer.OrdinalIgnoreCase
但他们不同意 'ü' 和 'ß' 的比较(见注 1)。
更具体的语言环境/文化(如DE-de)在处理空格和特殊字符方面有所不同。
我可以为 Java 和 .NET 选择哪一对不区分大小写的比较器/订单/整理器,它们对每个给定的 Unicode 字符串都一致?
(toLower/toUpper 不是一个选项,有几个原因)
注 1: 我假设 Java 在比较序数值之前执行了 toLower,而 C# 执行了 toUpper:
U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS (U+00C4) Ä
U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS (U+00D6) Ö
U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS (U+00DC) Ü
U+00DF LATIN SMALL LETTER SHARP S (U+00DF) ß
U+00E4 LATIN SMALL LETTER A WITH DIAERESIS (U+00E4) ä
U+00F6 LATIN SMALL LETTER O WITH DIAERESIS (U+00F6) ö
U+00FC LATIN SMALL LETTER U WITH DIAERESIS (U+00FC) ü
直到最近还没有capital letter for 'ß',所以还没有实现使用它——它不能解决上面的问题。
【问题讨论】:
-
您可以在 .NET 中尝试
InvariantIgnoreCase- 值得一试 -
The consumer is a C#-application which uses the list for a binary search algorithm, so it has to use exactly the same ordering.能否在 C# 端再次对数据进行排序以避免该问题? -
你的意思是
InvariantCultureIgnoreCase?这对拉丁字母表中的元音变音(äöüß)进行排序,而 Java 将它们排序到最后。 - 行号用作其他数据结构中查找表的键,因此我可能不会在接收方更改它们的顺序。
标签: java c# sorting locale case-insensitive