匹配相同的希伯来语单词总是返回False

时间:2019-02-05 13:09:12

标签: java android

我试图将相同的希伯来语单词彼此匹配,但它总是调用程序的其他部分。

这是我实际上在代码中尝试过的内容:

  

通过传递希伯来语单词来调用方法(来自string.xml)

<string name="shevat" >שְׁבָט‬</string>

getCurrentMonthIndex("שְׁבָט")
  

以下方法始终返回false

private boolean getCurrentMonthIndex(String month) {
    if (month.equals("שְׁבָט")) {
        Log.d("Result:", "equal");
        return true;
    } else {
        Log.d("Result:", "not equal");
        return false;
    }
}
  

如果我对值进行硬编码,则它返回true

private boolean getCurrentMonthIndex(String month) {
    if ("שְׁבָט".equals("שְׁבָט")) {
        Log.d("Result:", "equal");
        return true;
    } else {
        Log.d("Result:", "not equal");
        return false;
    }
}

2 个答案:

答案 0 :(得分:2)

您的字符串资源还有一个不可见的Unicode字符。

这是您在资源https://www.fontspace.com/unicode/analyzer/?q=%D7%A9%D6%B0%D7%81%D7%91%D6%B8%D7%98%E2%80%AC上的字符串

这是您在代码上的字符串:https://www.fontspace.com/unicode/analyzer/?q=%D7%A9%D6%B0%D7%81%D7%91%D6%B8%D7%98

多余的字符是U + 202C POP方向格式。

在比较阿拉伯字符串时,我遇到了类似的问题。就我而言,看不见的字符是U + 200E左至右标记。

在比较字符串之前,我从字符串中修剪了这个字符。您还可以修剪POP方向格式化。您也可以尝试使用十六进制编辑器从资源文件中删除此字符。

如果链接不起作用,请对您的字符串进行unicode分析:

U+05E9  HEBREW LETTER SHIN
U+05B0  HEBREW POINT SHEVA
U+05C1  HEBREW POINT SHIN DOT
U+05D1  HEBREW LETTER BET
U+05B8  HEBREW POINT QAMATS
U+05D8  HEBREW LETTER TET
U+202C  POP DIRECTIONAL FORMATTING //only on resource file

我对希伯来语了解不多,但我认为将来您还会遇到另一个问题。在您的单词中,第一个字母有两个修饰符:U + 05B0 HEBREW POINT SHEVA和0 + 05C1 HEBREW POINT SHIN DOT。 即使下面的两个字母看起来完全相同,但它们也不相等。修饰符的书写顺序不同。

שְׁ:U + 05E9 + U + 05B0 + U + 05C1

שְׁ:U + 05E9 + U + 05C1 + U + 05B0

我在阿拉伯语上遇到类似的问题。即使认为下面的两个词看起来相同,它们也不相等。 U + 064E阿拉伯FATHA和U + 0651阿拉伯SHADDA的书写顺序不同。

رَّ:U + 0631 + U + 064E + U + 0651

رَّ:U + 0631 + U + 0651 + U + 064E

对于阿拉伯语,在我的打字稿项目中,我写了一个实用程序方法来比较字符串之前将其标准化。规范化方法删除所有从左到右标记字符,并以标准方式对修饰符重新排序。我认为您可能需要为希伯来语做类似的事情。

@Elias N指出Java已经有一种标准化字符串的方法。此方法不会删除POP方向格式或从左到右的标记。

String a = "שְׁ";  //U+05E9 + U+05B0 + U+05C1
String b = "שְׁ";  //U+05E9 + U+05C1 + U+05B0

String nomrA = java.text.Normalizer.normalize(a, java.text.Normalizer.Form.NFC);
String nomrB = java.text.Normalizer.normalize(b, java.text.Normalizer.Form.NFC);

assertFalse("Original strings are not equal.", a.equals(b));
assertTrue("Normalized strings are equal.", normA.equals(normB));

答案 1 :(得分:1)

IDE的默认字符集为“ CP1252”。因此它将无法读取此非英语字符。您的IDE是否支持UTF-8字符集,如果是,则应返回true。 就像,如果我将此代码复制到Eclipse(通过将日志更改为sysout),那么它对我有用。