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

Java中如何区分普通问号'?'和替换字符'�'?

Java 区分替换字符�和普通问号?的方法

核心原理

两个字符的Unicode编码完全不同,直接对比编码值即可100%区分:

  • 原生普通问号的Unicode编码为U+003F,对应十进制值为63
  • 乱码替换字符�(正式名称为REPLACEMENT CHARACTER,一般是编码解码失败时的默认替换值)的Unicode编码为U+FFFD,对应十进制值为65533

具体实现方案

1. 单字符判断逻辑

public class CharIdentifyUtil {
    // 判断是否为原生普通问号
    public static boolean isNormalQuestionMark(char c) {
        return c == 0x3F; // 也可以直接写 c == 63
    }
    
    // 判断是否为乱码替换字符�
    public static boolean isReplacementChar(char c) {
        return c == 0xFFFD; // 也可以直接写 c == 65533
    }

    public static void main(String[] args) {
        char testChar1 = '�';
        char testChar2 = '?';
        System.out.println(isNormalQuestionMark(testChar1)); // 输出false
        System.out.println(isNormalQuestionMark(testChar2)); // 输出true
        System.out.println(isReplacementChar(testChar1)); // 输出true
        System.out.println(isReplacementChar(testChar2)); // 输出false
    }
}

2. 字符串批量判断逻辑

如果需要识别字符串中包含的两类字符,可以遍历逐个校验:

public static void checkAllCharsInStr(String input) {
    char[] charArray = input.toCharArray();
    for (int i = 0; i < charArray.length; i++) {
        char current = charArray[i];
        if (current == 0x3F) {
            System.out.printf("索引%d位置为原生普通问号%n", i);
        } else if (current == 0xFFFD) {
            System.out.printf("索引%d位置为乱码替换字符�%n", i);
        }
    }
}

注意事项

如果�是从控制台、日志文件里读取的展示内容,要提前确认原始字节流有没有被JVM、日志组件提前做过替换,避免拿到的字符已经是处理后的结果,和原始输入不一致。


内容的提问来源于stack exchange,提问作者Dar Gbu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:36:00