Java 如何比较基元类型中的字符大小写

Java 如何比较基元类型中的字符大小写,java,string,character,case-sensitive,case-insensitive,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 (n

我正在编写以下代码行:

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++;
}
String name1=fname.getText().toString();
字符串名称2=sname.getText().toString();
aru=0;
count1=name1.length();
count2=name2.length();
对于(i=0;i

我想比较两个
字符串的
字符
s,忽略大小写。简单地使用
IgnoreCase
是行不通的。添加“65”
ASCII
值也不起作用。如何执行此操作?

您可以在使用字符串之前更改其大小写,如下所示

String name1 = fname.getText().toString().toLowerCase(); 
String name2 = sname.getText().toString().toLowerCase();
然后继续执行rest操作。

Java API类具有各种可以使用的函数

您可以在两侧将字符转换为小写:

Character.toLowerCase(name1.charAt(i)) == Character.toLowerCase(name2.charAt(j))
还有一种方法可用于验证字母是大写还是小写:

Character.isUpperCase('P')
Character.isLowerCase('P') 

当比较字符/下层/上限时,你必须考虑土耳其语I问题:

我建议转换为字符串,并使用带有不变区域性的toLowerCase(至少在大多数情况下)

公共最终静态区域设置InvariantLocale=新区域设置(空、空、空); str.toLowerCase(不变量区域设置)

见类似的C#

注意:不要使用String.equalsIgnoreCase 无论是在字符串上还是在字符中,使用小写字母
都不可能真正做到这一点。问题在于,大写或小写都有不同的图示符,根据您是大写还是小写,您的图示符可能会被保留,也可能不会被保留。当你说一个小写字形的两个变体在忽略大小写的情况下进行比较时,你甚至不清楚你的意思是什么:它们是相同的还是不同的?(请注意,也有混合大小写标志符号:
\u01c5\u01c8\u01cb\u01f2
或Dž、Lj、Nj、Dz,但此处建议的任何方法都适用于这些标志符号,只要它们与完全大写或完全小写的变体计数相同。)

使用
Char
还有一个问题:大约有80个代码点不能用单个
Char
表示,它们是大写/小写变体(每个变体40个),至少Java的代码点大写/小写可以检测到这一点。因此,您需要获取代码点并更改这些代码的大小写

但代码点对变体图示符没有帮助

无论如何,这里有一个因变体而有问题的glyph的完整列表,显示了它们与6种变体方法的对比情况:

  • 字符
    toLowerCase
  • 字符
    toUpperCase
  • 字符串
    toLowerCase
  • 字符串
    toUpperCase
  • 字符串
    equalsIgnoreCase
  • 字符
    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 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         Ṡ ṡ   ẛ   
    
    更为复杂的是,除非你知道自己是土耳其语的,否则无法获得正确的土耳其语I(即,虚线版本不同于非虚线版本);这些方法都不能给出正确的行为,除非您知道语言环境(即非土耳其语:
    i
    i
    是相同的忽略案例;土耳其语,不是)

    总的来说,使用
    toUpperCase
    可以得到最接近的近似值,因为您只有五个大写变体(或者四个,不包括土耳其语)

    您还可以尝试专门拦截这五个麻烦案例,并单独对它们调用
    toUpperCase(toLowerCase(c))
    。如果您仔细选择防护装置(只需
    toUpperCase
    If
    c<0x130 | c>0x212B
    ,然后使用其他替代方案),则对于低范围内的字符,您只能获得约20%的速度惩罚(相比之下,如果您将单个字符转换为字符串并
    equalsIgnoreCase
    将其转换为4倍)如果你有很多人在危险区,那么只有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)
    }
    
    def-elevateCase(c:Char):Char={
    if(c<0x130 | | c>0x212B)字符.toUpperCase(c)
    else if(c==0x130 | | c==0x3F4 | | c==0x2126 | | c>=0x212A)
    Character.toUpperCase(Character.toLowerCase(c))
    else字符。toUpperCase(c)
    }
    
    比较两个带忽略大小写的字符串之间某个位置的字符的通用方法

    public static boolean isEqualIngoreCase(char one, char two){
        return Character.toLowerCase(one)==Character .toLowerCase(two);
    }
    
    public static boolean isEqualStringCharIgnoreCase(String one, String two, int position){
        char oneChar = one.charAt(position);
        char twoChar = two.charAt(position);
        return isEqualIngoreCase(oneChar, twoChar);
    }
    
    函数调用

    boolean isFirstCharEqual = isEqualStringCharIgnoreCase("abc", "ABC", 0)
    

    JDK就是这样做的(改编自OpenJDK 8,):


    我想这也适用于土耳其语。

    你可以使用
    字符。toLowerCase
    字符。toUpperCase
    将所有字符转换为小写或大写,并进行比较。@idottiger在英语中有效,但不是在所有语言中都有效。当心。如果我们正在处理一个“巨大”的字符串序列,字符串替换不会很慢吗“大”字符串?这在每种语言中都不起作用,例如,对于土耳其语,这将失败language@PeterBruins-您能分享一份会导致代码失败的土耳其文本样本吗?土耳其语“İ”(大写字母I,带点)是“i”的大写版本。有关详细信息:
    char
    类型已经过时,应该避免使用,因为它甚至无法表示Unicode中定义的一半字符。这实际上是个问题吗?Java可以将代码点表示为两个字符的组合。还应该使用什么?请参阅
    codePoint
    methods,例如and。这些方法使用
    int
    而不是
    char
    。并读取。
    static boolean charactersEqualIgnoringCase(char c1, char c2) {
      if (c1 == c2) return true;
    
      // If characters don't match but case may be ignored,
      // try converting both characters to uppercase.
      char u1 = Character.toUpperCase(c1);
      char u2 = Character.toUpperCase(c2);
      if (u1 == u2) return true;
    
      // Unfortunately, conversion to uppercase does not work properly
      // for the Georgian alphabet, which has strange rules about case
      // conversion.  So we need to make one last check before
      // exiting.
      return Character.toLowerCase(u1) == Character.toLowerCase(u2);
    }