编码解码实战

x33g5p2x  于2022-05-25 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(266)

一 对字符串进行编码和解码操作

1 代码

  1. public static void test21() throws CharacterCodingException {
  2. Charset charset = Charset.forName("utf-8");
  3. // 获取 utf-8 编码器
  4. CharsetEncoder charsetEncoder = charset.newEncoder();
  5. // 获取 utf-8 解码器
  6. CharsetDecoder charsetDecoder = charset.newDecoder();
  7. // 后续存储的“丁香JAVA讲师”共16字节:UTF-8中,每个常见汉字占 3 个字节;每个英文占 1 个字节。
  8. CharBuffer charBuffer = CharBuffer.allocate(16);
  9. charBuffer.put("丁香JAVA讲师");
  10. charBuffer.flip();
  11. System.out.println("编码开始");
  12. // 编码 :String->byte[],使用 utf-8 类型的编码器
  13. ByteBuffer byteBuffer = charsetEncoder.encode(charBuffer);
  14. for (int i = 0; i < 16; i++) { // 一个汉字占 3 个字节
  15. System.out.print(byteBuffer.get() + "\t");
  16. }
  17. System.out.println("\n编码结束\n");
  18. byteBuffer.flip();
  19. // 解码:byte[]->String,也使用utf-8类型的编码器
  20. System.out.println("---解码开始1---");
  21. charBuffer = charsetDecoder.decode(byteBuffer);
  22. System.out.println(charBuffer.toString());
  23. System.out.println("---解码结束1---\n");
  24. // byteBuffer 中存储的是经过 UTF-8 类型编码器编码后的字节码,但以下却是使用 gbk 类型的解码器解码,因此会出现乱码
  25. Charset charset2 = Charset.forName("gbk");
  26. byteBuffer.flip();
  27. System.out.println("---解码开始2---");
  28. charBuffer = charset2.decode(byteBuffer);
  29. System.out.println(charBuffer.toString());
  30. System.out.println("---解码结束2---\n");
  31. }

2 测试

编码开始

-28    -72    -127    -23    -90    -103    74    65    86    65    -24    -82    -78    -27    -72    -120    

编码结束

---解码开始1---

丁香JAVA讲师

---解码结束1---

---解码开始2---

涓侀JAVA璁插笀

---解码结束2---

二 使用 ISO-8859-1 对中文进行编码和解码

1 代码

  1. public static void test3() throws IOException {
  2. FileChannel inChannel
  3. = FileChannel.open(Paths.get("g:\\abc.txt"), StandardOpenOption.READ);
  4. FileChannel outChannel = FileChannel.open(Paths.get("g:\\abc2.txt"),
  5. StandardOpenOption.WRITE, StandardOpenOption.READ, StandardOpenOption.CREATE);
  6. MappedByteBuffer inMappedBuf = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
  7. MappedByteBuffer outMappedBuf = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
  8. Charset asciiCharset = Charset.forName("iso-8859-1");
  9. CharsetEncoder charsetEncoder = asciiCharset.newEncoder();
  10. CharsetDecoder charsetDecoder = asciiCharset.newDecoder();
  11. // 用 iso-8859-1 对 abc.txt 中的字符进行解码
  12. CharBuffer decodeResult = charsetDecoder.decode(inMappedBuf);
  13. // iso-8859-1 本身不能存储中文,因此会出现乱码
  14. for (int i = 0; i < decodeResult.length(); i++) {
  15. System.out.print(decodeResult.get(i) + "\t");
  16. }
  17. // 用 iso-8859-1 对解码后的字符,再次进行编码
  18. ByteBuffer encodeBuffer = charsetEncoder.encode(decodeResult);
  19. outMappedBuf.put(encodeBuffer);
  20. inChannel.close();
  21. outChannel.close();
  22. }

2 测试

ä    ¸        é    ¦        J    A    V    A    è    ®    ²    å    ¸        

但 abc2.txt 中的内容是正确的。

相关文章