Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配相同的希伯来语单词总是返回False_Java_Android - Fatal编程技术网

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

Java 匹配相同的希伯来语单词总是返回False,java,android,Java,Android,我试图将相同的希伯来语单词相互匹配,但它总是调用程序的其他部分 下面是我在代码中实际尝试的内容: 通过传递希伯来语单词(来自string.xml)调用方法 如果我硬编码了这个值,那么它将返回true IDE默认字符集为“CP1252”。因此,它将无法读取此非英语字符。IDE是否支持UTF-8字符集,如果支持,则应返回true。 例如,如果我将此代码复制到Eclipse(通过将log更改为sysout),那么它对我有效。您的字符串资源还有一个不可见的Unicode字符 这是资源上的字符串: 这是代

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

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

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

如果我硬编码了这个值,那么它将返回true


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

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

这是资源上的字符串:

这是代码上的字符串:

额外的字符是U+202C POP方向格式

我在比较阿拉伯语字符串时遇到了类似的问题。在我的例子中,不可见的字符是U+200E从左到右的标记

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));
在比较字符串之前,我从字符串中删除了这个字符。您还可以修剪弹出方向格式。您还可以尝试使用十六进制编辑器从资源文件中删除此字符

如果链接不起作用,请对字符串进行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希伯来语点舍瓦和0+05C1希伯来语点申点。 尽管下面的两个字母看起来完全相同,但它们并不相等。修饰符的书写顺序不同

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

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

我在阿拉伯语方面遇到了类似的问题。即使下面的两个词看起来相同,它们也不相等。U+064E阿拉伯法塔和U+0651阿拉伯沙达的书写顺序不同

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

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

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

已经指出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));

这意味着month变量与代码2中的希伯来语字符串不同。它包含相同的单词,下面是日志,字符串month从何而来?它是手工输入的吗?它可能与RTL文本有关,但我不确定…它来自string.xml文件,如果我通过硬编码值调用该方法,则返回true。尝试比较字节。我使用的是android studio,它支持UTF-8Oh,k。。如果您是从xml中读取的,那么您可以在比较之前尝试打印(日志),这样您就可以清楚地知道传递给方法的字符串是什么。您可能还需要在规范化时检查这一点:这是java实现:@EliasN感谢您提供的信息。我尝试了JavaAPI来比较阿拉伯语和希伯来语单词,它非常适合不同的unicode顺序。但它不会删除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
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));