fge*_*fge 3 java character-encoding
我有一个文件,或者我从套接字读取; 我读过的数据应该用给定的字符编码进行文本编码.
但即使我指定了一个编码并且最终证明它是错误的,操作也会成功; 而不是任何类型的例外,我?在我的文本中得到了很多:/
有没有办法可以触发失败呢?
就在这里.
首先,一些信息:那个讨厌的?角色真的是什么?好吧,它是Unicode的"替换字符",代码点U + FFFD.
现在,你为什么这样做?为了解释这一点,我们需要深入研究发生的事情......
首先,"正式"定义:字符编码是定义字节流和字符流之间的双射的过程; 因为它是一个双射,它意味着定义了两个操作:编码(将字符流转换为字节流)和解码(将字节流转换为字符流).
在Java中,字符编码包含在Charset; 你可以使用Charset.newEncoder()和使用解码器获得编码器Charset.newDecoder().
当然,可能会发生在解码过程中,这是感兴趣的,一定的字节序列结果是格式错误,在这种情况下,CharsetDecoder必须决定做什么......而这种行为取决于CodingErrorAction,它有三个值:
REPLACE(默认!!):用Unicode的替换字符替换任何不可映射的序列!IGNORE:废除所有不可映射的序列,不输出任何内容;REPORT:在不可映射的序列上抛出异常......现在,我们想要检测格式错误的输入并抛出错误就是REPORT他们!
那么,我们如何做到这一点InputStream呢?解决方案是使用InputStreamReader; 它有一个构造函数,允许您指定一个CharsetDecoder参数.您所要做的就是创建解码器!
例如,如果您想确保正确的UTF-8,您可以这样做:
final CharsetDecoder decoder = StandardCharsets.UTF_8
.newDecoder().onMalformedInput(CodingErrorAction.REPORT);
try (
final InputStreamReader reader = new InputStreamReader(in, decoder);
) {
// read from the reader here
}
Run Code Online (Sandbox Code Playgroud)
你想要捕获的例外是一个CharacterCodingException.请注意,它继承IOException,因此您希望:
try (
...
) {
...
} catch (CharacterCodingException e) {
...
} catch (IOException e) {
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32 次 |
| 最近记录: |