代码之家  ›  专栏  ›  技术社区  ›  Suraj Bahadur

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

  •  2
  • Suraj Bahadur  · 技术社区  · 7 年前

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

    下面是我在代码中的实际尝试:

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

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

    bellow方法总是返回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 回复  |  直到 7 年前
        1
  •  2
  •   fthdgn    7 年前

    字符串资源还有一个不可见的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流行方向格式。

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

    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希伯来点SHEVA和0+05C1希伯来点SHIN DOT。

    ד×:U+05E9+U+05B0+U+05C1

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

    ±:U+0631+U+064E+U+0651

    ±:U+0631+U+0651+U+064E

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

    @Elias N 已经指出Java已经有了一个方法来规范化字符串。此方法不移除弹出方向格式或从左到右标记。

    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));
    
        2
  •  1
  •   Eknath Patil    7 年前

    例如,如果我将此代码复制到Eclipse(通过将log更改为sysout),那么它对我有效。