为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2022-06-04 17:35:10
我试图将相同的希伯来语单词相互匹配,但它总是调用 else 程序的一部分。这是我在代码中实际尝试的:通过传递希伯来语单词调用方法(来自 string.xml)<string name="shevat" >שְׁבָט‬</string>getCurrentMonthIndex("שְׁבָט")下面的方法总是返回 falseprivate boolean getCurrentMonthIndex(String month) {    if (month.equals("שְׁבָט")) {        Log.d("Result:", "equal");        return true;    } else {        Log.d("Result:", "not equal");        return false;    }}如果我对值进行硬编码,那么它返回 trueprivate boolean getCurrentMonthIndex(String month) {    if ("שְׁבָט".equals("שְׁבָט")) {        Log.d("Result:", "equal");        return true;    } else {        Log.d("Result:", "not equal");        return false;    }}
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


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


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


额外的字符是 U+202C POP DIRECTIONAL FORMATTING。


我在比较阿拉伯语字符串时遇到了类似的问题。在我的例子中,隐形字符是 U+200E LEFT-TO-RIGHT MARK。


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


如果链接不起作用,请对您的字符串进行 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 ARABIC FATHA 和 U+0651 ARABIC SHADDA 以不同的顺序书写。


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


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


对于阿拉伯语,在我的打字稿项目中,我编写了一个实用方法来在比较字符串之前对其进行规范化。规范化方法删除所有 LEFT-TO-RIGHT MARK 字符并以标准方式重新排列修饰符字符。我认为您可能需要为希伯来语做类似的事情。


@Elias N指出,Java 已经有一种规范化字符串的方法。此方法不会删除 POP DIRECTIONAL FORMATTING 或 LEFT-TO-RIGHT MARK。


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));


查看完整回答
反对 回复 2022-06-04
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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



查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信