You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:01:48