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
相关产品推荐
相关产品推荐

