关于Character.isLetter()处理中文的情景

-------------------------------------------背景(着急看解决方案的翻到“解决方案”)------------------------------

       今天是学习JAVASE的第13天,在做包装类的习题时遇到了这么一个题

完成用户注册时的姓名和密码校验工作。
要求姓名必须全是英文字母组成。
密码中必须包含数字、大写字母和小写字母。

---------------------------------------------------------------过程-----------------------------------------------------------

我心想,这还不简单,账号的校验通过toCharArray()方法将输入的账号变成字符数组,然后遍历每个字符,用isLetter()方法判断不就好了吗。说干就干:

 

Scanner sc = new Scanner(System.in);
        boolean ifOk = false;
        while (!ifOk) {
            System.out.println("输入姓名");
            String name = sc.next();
            char[] chars = name.toCharArray();
           
for ( int i =0;i<chars.length;i++) {
                if (Character.isLetter(chars[i])) {
               //如果是字母,就把ifOk变成true,后面如果还是字母,ifOk仍然是ture。除非出现非字母。
                    ifOk = true;
                } else {
                    //如果不是字母,把ifOk变回false,注意,是变回!然后结束内循环(也就是外循环)
                    System.out.println("姓名格式错误,请重新输入");
                    ifOk=false;
                    break;
                }
            }       

}

写完了,立马去运行,输入英文和数字时程序还乖乖地运行,直到我输入了汉字...........

本以为会重复让我输入名字,结果程序循环居然结束了!这令我大吃一惊。

-------------------------------------------------------------解决过程--------------------------------------------------------

查阅资料后发现,Java从出生就支持对Unicode编码方式的支持,每个中文在Unicode表里都有自己对应的码,所以中文在JAVA眼里是一个Letter...........

补:Unicode 出现的目的很简单——将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码。呵呵,聪明(不是)的漂亮国

-------------------------------------------------------------解决方案-------------------------------------------------------

解决方法很简单啊

要么用isLowerCase()配合isUpperCase()使用,要么就老老实实地用ASCII码进行大小比较吧。

-----------------------------------------------------------本期问题答案----------------------------------------------------

public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        boolean ifOk = false;
        while (!ifOk) {
            System.out.println("输入姓名");
            String name = sc.next();
            char[] chars = name.toCharArray();
            for (int i =0;i<chars.length;i++) {
                if ( Character.isUpperCase(chars[i])||Character.isLowerCase(chars[i])) {
             //如果是字母,就把ifOk变成true,后面如果还是字母,ifOk仍然是ture。除非出现非字母。
                    ifOk = true;
                } else {
                  //如果不是字母,把ifOk变回false,注意,是变回!然后结束内循环(也就是外循环)
                    System.out.println("姓名格式错误,请重新输入");
                    ifOk=false;
                    break;
                }
            }

        }
        ifOk = false;
        while (!ifOk) {
            System.out.println("请输入密码:");
            String password = sc.next();
            char[] chars= password.toCharArray();
            boolean ifLowerCase = false;
            boolean ifDigit = false;
            boolean ifUpperCase = false;
            for (int i = 0; i < chars.length; i++) {
                if(Character.isDigit(chars[i])){ifDigit=true;}
                if(Character.isUpperCase(chars[i])){ifUpperCase=true;}
                if(Character.isLowerCase(chars[i])){ifLowerCase=true;}
            }
            ifOk = ifDigit&&ifLowerCase&&ifUpperCase;
            if(!ifOk){
                System.out.println("密码格式不正确,请重新输入");
            }
        }
        System.out.println("注册成功!");
    }

-------------------------------------------------------------最后-------------------------------------------------------------

这是我第一次发文章,有不对的地方大家见谅,有错误欢迎批评指正,大家一起进步鸭!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值