public static void test21() throws CharacterCodingException {
Charset charset = Charset.forName("utf-8");
// 获取 utf-8 编码器
CharsetEncoder charsetEncoder = charset.newEncoder();
// 获取 utf-8 解码器
CharsetDecoder charsetDecoder = charset.newDecoder();
// 后续存储的“丁香JAVA讲师”共16字节:UTF-8中,每个常见汉字占 3 个字节;每个英文占 1 个字节。
CharBuffer charBuffer = CharBuffer.allocate(16);
charBuffer.put("丁香JAVA讲师");
charBuffer.flip();
System.out.println("编码开始");
// 编码 :String->byte[],使用 utf-8 类型的编码器
ByteBuffer byteBuffer = charsetEncoder.encode(charBuffer);
for (int i = 0; i < 16; i++) { // 一个汉字占 3 个字节
System.out.print(byteBuffer.get() + "\t");
}
System.out.println("\n编码结束\n");
byteBuffer.flip();
// 解码:byte[]->String,也使用utf-8类型的编码器
System.out.println("---解码开始1---");
charBuffer = charsetDecoder.decode(byteBuffer);
System.out.println(charBuffer.toString());
System.out.println("---解码结束1---\n");
// byteBuffer 中存储的是经过 UTF-8 类型编码器编码后的字节码,但以下却是使用 gbk 类型的解码器解码,因此会出现乱码
Charset charset2 = Charset.forName("gbk");
byteBuffer.flip();
System.out.println("---解码开始2---");
charBuffer = charset2.decode(byteBuffer);
System.out.println(charBuffer.toString());
System.out.println("---解码结束2---\n");
}
编码开始
-28 -72 -127 -23 -90 -103 74 65 86 65 -24 -82 -78 -27 -72 -120
编码结束
---解码开始1---
丁香JAVA讲师
---解码结束1---
---解码开始2---
涓侀JAVA璁插笀
---解码结束2---
public static void test3() throws IOException {
FileChannel inChannel
= FileChannel.open(Paths.get("g:\\abc.txt"), StandardOpenOption.READ);
FileChannel outChannel = FileChannel.open(Paths.get("g:\\abc2.txt"),
StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
MappedByteBuffer inMappedBuf = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
MappedByteBuffer outMappedBuf = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
Charset asciiCharset = Charset.forName("iso-8859-1");
CharsetEncoder charsetEncoder = asciiCharset.newEncoder();
CharsetDecoder charsetDecoder = asciiCharset.newDecoder();
// 用 iso-8859-1 对 abc.txt 中的字符进行解码
CharBuffer decodeResult = charsetDecoder.decode(inMappedBuf);
// iso-8859-1 本身不能存储中文,因此会出现乱码
for (int i = 0; i < decodeResult.length(); i++) {
System.out.print(decodeResult.get(i) + "\t");
}
// 用 iso-8859-1 对解码后的字符,再次进行编码
ByteBuffer encodeBuffer = charsetEncoder.encode(decodeResult);
outMappedBuf.put(encodeBuffer);
inChannel.close();
outChannel.close();
}
ä ¸ é ¦ J A V A è ® ² å ¸
但 abc2.txt 中的内容是正确的。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/124951508
内容来源于网络,如有侵权,请联系作者删除!