如何比较原始类型中的字符忽略情况

Aru*_*boj 22 java string character case-sensitive case-insensitive

我正在写这些代码行:

String name1 = fname.getText().toString();
String name2 = sname.getText().toString();
aru = 0;

count1 = name1.length();
count2 = name2.length();
for (i = 0; i < count1; i++)
{  
    for (j = 0; j < count2; j++)
    { 
        if (name1.charAt(i)==name2.charAt(j))
            aru++;
    }
    if(aru!=0)
        aru++;
}
Run Code Online (Sandbox Code Playgroud)

我想比较Character两个人String忽视这个案子的情况.简单地使用IgnoreCase不起作用.添加"65" ASCII值也不起作用.我该怎么做呢?

She*_*zad 40

Character级的Java API的有,你可以使用各种功能.

您可以将两侧的char转换为小写:

Character.toLowerCase(name1.charAt(i)) == Character.toLowerCase(name2.charAt(j))
Run Code Online (Sandbox Code Playgroud)

还有一种方法可用于验证字母是大写还是小写:

Character.isUpperCase('P')
Character.isLowerCase('P') 
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于每种语言,例如,这对于土耳其语将失败 (4认同)

Rex*_*err 13

你不能真正做的工作很正确用toLowerCase,无论是在一个字符串或字符.问题是大写或小写都有变体字形,并且取决于你是否大写或小写你的字形可能会或可能不会被保留.当你说小写字形的两个变体被比较忽略大小时,你甚至不清楚你什么意思:它们是不是相同?(请注意,还有混合大小写的字形:\u01c5, \u01c8, \u01cb, \u01f2或者Dž,Lj,Nj,Dz,但是这里建议的任何方法都适用于那些,只要它们应该与它们的完全上部或完全小写变体相同.)

使用时还有一个问题Char:有大约80个代码点无法用单个Char大小/小写变体(每个40个)表示,至少由Java的代码点上/下外壳检测到.因此,您需要获取代码点并更改这些代码.

但是代码点对变体字形没有帮助.

无论如何,这里有一个由于变体而有问题的字形的完整列表,显示它们如何对抗6种变体方法:

  1. 字符 toLowerCase
  2. 字符 toUpperCase
  3. toLowerCase
  4. toUpperCase
  5. equalsIgnoreCase
  6. 人物toLowerCase(toUpperCase)(反之亦然)

对于这些方法,S意味着变体被视为彼此相同,D意味着变体被视为彼此不同.

Behavior     Unicode                             Glyphs
===========  ==================================  =========
1 2 3 4 5 6  Upper  Lower  Var Up Var Lo Vr Lo2  U L u l l2
- - - - - -  ------ ------ ------ ------ ------  - - - - -
D D D D S S  \u0049 \u0069 \u0130 \u0131         I i ? ?   
S D S D S S  \u004b \u006b \u212a                K k ?     
D S D S S S  \u0053 \u0073        \u017f         S s   ?   
D S D S S S  \u039c \u03bc        \u00b5         ? ?   µ   
S D S D S S  \u00c5 \u00e5 \u212b                Å å ?     
D S D S S S  \u0399 \u03b9        \u0345 \u1fbe  ? ?   ? ? 
D S D S S S  \u0392 \u03b2        \u03d0         ? ?   ?   
D S D S S S  \u0395 \u03b5        \u03f5         ? ?   ?   
D D D D S S  \u0398 \u03b8 \u03f4 \u03d1         ? ? ? ?   
D S D S S S  \u039a \u03ba        \u03f0         ? ?   ?   
D S D S S S  \u03a0 \u03c0        \u03d6         ? ?   ?   
D S D S S S  \u03a1 \u03c1        \u03f1         ? ?   ?   
D S D S S S  \u03a3 \u03c3        \u03c2         ? ?   ?   
D S D S S S  \u03a6 \u03c6        \u03d5         ? ?   ?   
S D S D S S  \u03a9 \u03c9 \u2126                ? ? ?     
D S D S S S  \u1e60 \u1e61        \u1e9b         ? ?   ?   
Run Code Online (Sandbox Code Playgroud)

更复杂的是,除非你知道你是土耳其语,否则没有办法让土耳其语我是对的(即点缀版本与未注册的版本不同).这些方法都没有给出正确的行为,除非您知道区域设置(即非土耳其语:i并且I是相同的忽略案例;土耳其语,不是).

总的来说,使用toUpperCase给出了最接近的近似值,因为您只有五个大写变体(或四个,不包括土耳其语).

您还可以尝试专门拦截这五个麻烦的案例并toUpperCase(toLowerCase(c))单独调用它们.如果你仔细选择你的警卫(只是toUpperCase如果c < 0x130 || c > 0x212B,然后通过其他替代方案),你只能在低范围内的角色获得约20%的速度惩罚(相比之下,如果你将单个字符转换成字符串,则为~4倍equalsIgnoreCase)和如果您在危险区域有很多,那么只会大约2倍的罚款.你仍然有点缀的区域设置问题I,但否则你的形状不错.当然,如果你可以使用equalsIgnoreCase更大的字符串,你最好这样做.

以下是完成工作的示例Scala代码:

def elevateCase(c: Char): Char = {
  if (c < 0x130 || c > 0x212B) Character.toUpperCase(c)
  else if (c == 0x130 || c == 0x3F4 || c == 0x2126 || c >= 0x212A)
    Character.toUpperCase(Character.toLowerCase(c))
  else Character.toUpperCase(c)
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*ikh 8

您可以在使用之前更改String的大小写,如下所示

String name1 = fname.getText().toString().toLowerCase(); 
String name2 = sname.getText().toString().toLowerCase();
Run Code Online (Sandbox Code Playgroud)

然后继续休息操作.

  • 谨防[土耳其语语言环境问题](http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug). (4认同)