gpt4 book ai didi

java - 为什么 US-ASCII 编码接受非 US-ASCII 字符?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:36:11 28 4
gpt4 key购买 nike

考虑以下代码:

public class ReadingTest {

public void readAndPrint(String usingEncoding) throws Exception {
ByteArrayInputStream bais = new ByteArrayInputStream(new byte[]{(byte) 0xC2, (byte) 0xB5}); // 'micro' sign UTF-8 representation
InputStreamReader isr = new InputStreamReader(bais, usingEncoding);
char[] cbuf = new char[2];
isr.read(cbuf);
System.out.println(cbuf[0]+" "+(int) cbuf[0]);
}

public static void main(String[] argv) throws Exception {
ReadingTest w = new ReadingTest();
w.readAndPrint("UTF-8");
w.readAndPrint("US-ASCII");
}
}

观察到的输出:

µ 181
? 65533

为什么第二次调用 readAndPrint()(使用 US-ASCII 的)会成功?我希望它会抛出错误,因为输入不是此编码中的正确字符。强制执行此行为的 Java API 或 JLS 中的什么位置?

最佳答案

在输入流中找到不可解码字节时的默认操作是用 Unicode 字符替换它们 U+FFFD REPLACEMENT CHARACTER .

如果你想改变它,你可以传递 CharacterDecoder to the InputStreamReader它有一个不同的 CodingErrorAction配置:

CharsetDecoder decoder = Charset.forName(usingEncoding).newDecoder();
decoder.onMalformedInput(CodingErrorAction.REPORT);
InputStreamReader isr = new InputStreamReader(bais, decoder);

关于java - 为什么 US-ASCII 编码接受非 US-ASCII 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886460/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com