NIO Charset

一个简单的输入输出的demo

 public static void main(String[] args) throws IOException {
    // 定义输入文件的名称
    String inputFile = "NioTest13_in.txt";
    // 定义输出文件的名称
    String outFile = "NioTest13_out.txt";
    try (// 定义随机访问文件读写的输入File
         RandomAccessFile inRandomAccessFile = new RandomAccessFile(inputFile, "r");
         // 定义随机访问文件读写的输出File
         RandomAccessFile outRandomAccessFile = new RandomAccessFile(outFile, "rw")) {
        // 读取输入文件的长度
        long inputLength = inRandomAccessFile.length();
        // 获取输入的channel
        FileChannel inChannel = inRandomAccessFile.getChannel();
        // 获取输出的channel
        FileChannel outChannel = outRandomAccessFile.getChannel();

        // 定义一个内存直接定义区域
        MappedByteBuffer map = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inputLength);

        // 设置utf-8的charset
        Charset charset = Charset.forName("utf-8");
        // 设置编码器
        CharsetEncoder charsetEncoder = charset.newEncoder();
        // 设置解码器
        CharsetDecoder charsetDecoder = charset.newDecoder();
        // 将内存缓存区的buffer 解码为CharBuffer
        CharBuffer charBuffer = charsetDecoder.decode(map);
        // 将charBuffer 编码为buffer
        ByteBuffer buffer = charsetEncoder.encode(charBuffer);
        // 将buffer输出
        outChannel.write(buffer);

    }
}

将demo中的

    Charset charset = Charset.forName("utf-8"); 

修改为

Charset charset = Charset.forName("ios-8859-1"); 

之后输出的结果也是正确的。

查看所有的字符集

// 获取所有的字符集
Charset.availableCharsets().forEach((k, v) -> System.out.println(k + “–” + v));

字符编码详细介绍

SCAII(American Code For Information Interchanger ,美国信息交换标准代码),
占用8位,但是使用7 bit表示一个字符,最多可以表示256个字符,但是只规定了128个字符。

ASCII码的问题是字符太少,不能满足世界各国的需要。所以各国其他编码利用剩余的128个字符定义各自不同的编码。

ISO-8859-1(是SCAII的超集,完全兼容SCAII)
8 bit表示一个字节,即用一个字节。共计可以表示256个字符,

gb2312(国标)
两个字节表示一个汉字。

gbk(在gb2312增加了一些生僻字)

gb18030(国标超集 字符最多)

big5(台湾繁体字符)

unicode (最全的字符集,包含全世界的字符)

UTF(unicode Translation Format )

unicode 是一种编码方式,而UTF是一种存储方式。UTF-8是unicode的一种实现方式。

UTF-8(变长字节表示形式。一般通过3个字节表示一个中文。)

在之前的demo中

将demo中的

    Charset charset = Charset.forName("utf-8"); 

修改为

Charset charset = Charset.forName("ios-8859-1"); 

之后输出的结果也是正确的。

查看demo中的核心代码可以看出,

	// 设置utf-8的charset
        Charset charset = Charset.forName("utf-8");
	CharsetEncoder charsetEncoder = charset.newEncoder();
     // 设置解码器
     CharsetDecoder charsetDecoder = charset.newDecoder();
     // 将内存缓存区的buffer 解码为CharBuffer
     CharBuffer charBuffer = charsetDecoder.decode(map);
	// 将charBuffer 编码为buffer
        ByteBuffer buffer = charsetEncoder.encode(charBuffer);

在解码和编码的时候,都使用的ios-8859-1 的方式将字节 解码和编码到目标文件里面,但是目标文件的编码格式和源文件的编码格式都是相同的。那么按照文件的编码格式进行字节的解析,此时解析出来的文件是是和源文化一样的,是不会出现乱码错误的。但是如果查看解码之后的charBuffer。此时输出的char字符是会出现乱码的。

中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。

转载自:https://baijiahao.baidu.com/s?id=1631122426163536394&wfr=spider&for=pc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值