编码解码实战

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

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

1 代码

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");
}

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 代码

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();
}

2 测试

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

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

相关文章