字符集编码解析

package com.wq.nio;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

/**
 * 1.ASCII American Standard Code for Information Interchange,美国信息交换标准代码
 *      7 bit来表示一个字符,共计可以表示128种字符
 * 2.ISO-8859-1
 *      8 bit来表示一个字符,即用一个字节byte 8bit来表示一个字符,共计可以表示256个字符,基于ASCII扩张完全适配
 * 3.gb2312 中国国家标准制定
 *      2 bit表示一个汉字   表示不了生僻字
 * 4.gbk
 *      能够表示生僻字
 * 5.gb18030 最完整的的汉字表达形式
 *
 * 6.big5 台湾繁体中文
 *
 * 7.unicode 表示全世界所有国家的字符,最全字符编码形式              存储容量会巨大膨胀,不适用于存储对于英文国家
 *      2字节表示一个字符
 * 8.UTF unicode Translation Format
 *      unicode是一种编码方式,而UTF是一种存储方式,utf-8是UTF的实现方式之一,
 *
 *      utf-16 2字节表示  还是浪费存储
 *      UTF-16LE little endian   UTF-16BE big endian   大端  小端
 *      Zero Width No-Break Space,实际上不存在,用16进制0xFEFF  这种叫BE    0xFFFE  叫做LE
 *
 *      utf-8 变长字节表示形式  兼容ASCII  ISO-8859-1
 *      一般utf-8用3个字节表示中文,最多用6个字节表示但是不常用
 *
 *      BOM (Byte Order Mark) 字节序标记   windows会有bom头   如果解码不考虑会无法识别
 */
public class NioTest13 {
    public static void main(String[] args) throws IOException {
        String inputFile = "src/main/java/com/wq/nio/NioTest13_in.txt";
        String outputFile = "src/main/java/com/wq/nio/NioTest13_out.txt";
        RandomAccessFile input = new RandomAccessFile(inputFile,"r");
        RandomAccessFile output = new RandomAccessFile(outputFile,"rw");

        Long inputLength = new File(inputFile).length();

        FileChannel inputChannel = input.getChannel();
        FileChannel outputChannel = output.getChannel();
        //内容是文件内存映射区域的直接字节缓冲区。
        MappedByteBuffer inputData = inputChannel.map(FileChannel.MapMode.READ_ONLY,0,inputLength);
        CharBuffer charBuffer = Charset.forName("iso-8859-1").decode(inputData);//解码
        System.out.println(charBuffer.get(7));
        ByteBuffer byteBuffer = Charset.forName("iso-8859-1").encode(charBuffer);//编码
        outputChannel.write(byteBuffer);

        input.close();
        output.close();

        System.out.println("=========输出系统所有可用的编码字符集===============");
        Charset.availableCharsets().forEach((k,v)->{
            //System.out.println(k+","+v);
        });
        System.out.println("=========输出系统所有可用的编码字符集===============");
        //nihao
        //你好

}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值