在Java中将char转换为大写

86

我该如何将变量fl转换为大写字母?

String lower = Name.toLowerCase();
int a = Name.indexOf(" ",0);
String first = lower.substring(0, a);
String last = lower.substring(a+1);

char f = first.charAt(0);
char l = last.charAt(0);

System.out.println(l);

你在之前的问题中没有理解哪部分答案? 那里面的回答已经包含了这个问题的答案。 - Bozho
@shep - 你能接受BalusC的答案吗?这将有助于未来的搜索者。 - charles-allen
11个回答

159

你可以使用Character#toUpperCase() 来实现。

char fUpper = Character.toUpperCase(f);
char lUpper = Character.toUpperCase(l);

然而,它仍有一些局限性,因为世界上已知的字符数量超出了16位char范围所能容纳的范围。请参阅以下javadoc摘录:

注意:此方法无法处理补充字符。要支持所有Unicode字符(包括补充字符),请使用toUpperCase(int)方法。


47

不使用现有的实用程序,您可以尝试使用布尔运算进行以下转换:

转换为大写字母:

 char upperChar = 'l' & 0x5f

转换为小写:

   char lowerChar = 'L' ^ 0x20

工作原理:

二进制、十六进制和十进制表格:

------------------------------------------
| Binary   |   Hexadecimal     | Decimal |
-----------------------------------------
| 1011111  |    0x5f           |  95     |
------------------------------------------
| 100000   |    0x20           |  32     |
------------------------------------------

让我们来举个小写字母 l 转换成大写字母 L 的例子:

二进制 AND 运算:(l & 0x5f)

l 字符的ASCII码是 108,二进制表示为 01101100

   1101100
&  1011111
-----------
   1001100 = 76 in decimal which is **ASCII** code of L

同样的,L 到 l 的转换:

二进制异或运算:(L ^ 0x20)

   1001100
^  0100000
-----------
   1101100 = 108 in decimal which is **ASCII** code of l

15
我对这个有七个投票的想法感到震惊。虽然我欣赏聪明的方法,但是过于聪明很少能导致可维护的代码,特别是当用来代替像 Character.toUpperCase() 这样的内置方法时。使用此方法的任何用户都应理解它不能处理任何非 ASCII 字符。 - Adam Hewitt
1
@AdamHewitt 这种方法也适用于非ASCII字符,例如'250',但是少数非ASCII字符可能会导致意外的结果。您的观点是正确的,用户应该理解这种方法的正确使用方式,并且它主要应该用于英文字母。 - Rahul Sharma
1
我认为应该使用c | 0x20而不是c ^ 0x20来转换字符为小写。否则,如果字符已经是小写,你的代码会将其转换为大写。 - Steven Yue

19

请查看 java.lang.Character 类,它提供了很多有用的方法来转换或测试字符。


2
+1 我喜欢回答中提供给用户参考的答案。 - Anthony Forloney
3
如果我们对学生进行大规模搜索,将会丧失 Stack Overflow 的一个主要优势,即不需要花费过多的时间跟随人们在断开的链接中嵌套引用。 - ebt

15
f = Character.toUpperCase(f);
l = Character.toUpperCase(l);

6

由于您知道这些字符为小写字母,因此您可以减去相应的ASCII值将它们变成大写字母:

char a = 'a';
a -= 32;
System.out.println("a is " + a); //a is A

这里提供一个ASCII表以供参考。


4
只有当字符串完全由ASCII字符组成时,此方法才有效。例如法语、希腊语、西班牙语、土耳其语等语言中存在具有大小写形式的非ASCII字符。这种方法在这些情况下将无法运行... - Mike Laren
实际上,这种基本方法对于法语、西班牙语、德语中最常见的非ASCII字符是有效的,例如 é à ö û ñ 等等。因此,如果原帖作者知道自己只需要处理这些字符,为了简单和性能,他可以坚持使用这种方法。 - Sébastien
1
使用字符进行大小写转换的计算是最糟糕的习惯之一,不适用于21世纪!还有更多的字符编码! - Floyd

5
System.out.println(first.substring(0,1).toUpperCase()); 
System.out.println(last.substring(0,1).toUpperCase());

1
你能解释一下你的答案吗? - soundslikeodd
first.substring(0,1) 将检索字符串中索引为0的子字符串,然后应用 toUpperCase 方法将该字符串转换为大写,从而使您可以获得该字符串中的第一个字符为大写。 - Likhith Kumar

2
如果您在项目中包含了apache commons lang jar文件,那么最简单的解决方案是执行以下操作:
WordUtils.capitalize(Name)

它为你处理所有的繁琐工作。 请查看javadoc 这里

或者,你还可以使用capitalizeFully(String)方法,该方法还会将其余字符转换为小写。


你提供的链接出现了404错误!!!你能修正一下吗? - Visruth

2
您可以直接在字符串变量上应用.toUpperCase(),也可以将其作为文本字段的属性。例如:-
String str;
TextView txt;

str.toUpperCase();// will change it to all upper case OR
txt.append(str.toUpperCase());
txt.setText(str.toUpperCase());

1
假设您有一个要拆分的变量。
String name = "Your name variable";
char nameChar = Character.toUpperCase(name.charAt(0));

0

我认为您正在尝试使用空格作为分隔符,将句子中每个单词的首字母和末字母大写。

可以通过StringBuffer实现:

public static String toFirstLastCharUpperAll(String string){
    StringBuffer sb=new StringBuffer(string);
        for(int i=0;i<sb.length();i++)
            if(i==0 || sb.charAt(i-1)==' ' //for first character of string/each word
                || i==sb.length()-1 || sb.charAt(i+1)==' ') //for last character of string/each word
                sb.setCharAt(i, Character.toUpperCase(sb.charAt(i)));
     return sb.toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接