Java字符数组大写转小写时小写字符被替换为?的问题排查
字符数组转小写时原小写字母被替换为
?问题修复 问题原因
判断逻辑缺失上界约束,导致小写字母被错误执行转换计算,得到的字符超出可打印范围被渲染为?。
ASCII码中英文字符的码值范围如下:
- 大写字母
A-Z:65~90 - 小写字母
a-z:97~122
原代码的判断条件if(a[i] >= 'A')仅做了下界判断,所有小写字母的码值都大于65,会和大写字母一起进入转换分支。
以原字符串开头的小写字母n(码值110)为例,代入转换公式计算:110 - 'A'(65) + 'a'(97) = 142
这个码值不属于常规可打印英文字符范围,控制台无法正常识别就会显示为?,和你得到的输出?????nkdnkcn????完全匹配:前5位原小写字母计算后不可打印、中间7位原大写字母正常转换为小写、后4位原小写字母计算后不可打印。
修复方案
给判断条件补全大写字母的上界约束,仅对A-Z区间的字符执行转小写逻辑:
// 原错误判断 // if(a[i] >= 'A') // 修复后判断 if(a[i] >= 'A' && a[i] <= 'Z'){ a[i] = (char)(a[i]-'A'+'a'); }
修复后完整代码:
String s = new String("ndkcnNKDNKCNnknd"); char[] a = s.toCharArray(); System.out.println(a[2]); for (int i=0; i<a.length; i++){ if(a[i] >= 'A' && a[i] <= 'Z'){ a[i] = (char)(a[i]-'A'+'a'); } } s = String.copyValueOf(a); System.out.println(s);
运行输出符合预期:
k ndkcnnkdnkcnnknd
实用提示:日常开发做大小写转换直接调用String类自带的
toLowerCase()方法即可,无需手动遍历字符计算,可避免这类边界判断失误。
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

