JAVA编码转换备忘录

本文深入探讨了Unicode编码的重要性,解释了JVM如何处理Unicode编码,并提供了JAVA中转换编码的实用方法。通过理解内存中Unicode编码的唯一性,文章阐述了如何在不同编码间进行正确的转换,避免乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编码转换真心有点绕,以前只有用到的时候才会去思考,但仍然很迷糊,而且编码问题会时不时的跳出来烦你一下,这次因为所有脚本用的是UTF-8写的跑去用sqlplus 批量执行居然报各种异常… 所以这里决定总结一下,写篇备忘录.

1、JVM Unicode编码

百度百科:Unicode编码(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
意思是全世界出现的所有语言 所有符号Unicode都有唯一的对应编码,可想而知为了通用 计算机内存里用的正是这种编码,JVM也是用的这种编码 ,但显而易见 这种编码有个缺点,就是占用空间大(容纳了所有字符,每个字符的编码前面补0就会特别多), 内存为了兼容使用这编码没什么问题,但持久化到硬盘等存储介质时候就明显了

所以持久化的文件 或者流传输常常用的是Unicode编码的实现方式 或者 其他较小的编码 如 GBK UTF-8

但是计算机内部的工作方式是不变的 即什么编码到内存里都会转为单一的Unicode编码
如记事本工作方式
在这里插入图片描述

这也是为什么用剪切板能在两个不同编码的文件复制黏贴而不乱码的原因 以前初学java的时候常碰到乱码的事情 用的就是记事本去转码。

2、JAVA内如何转换编码

先看String的API内的两方法
在这里插入图片描述
这是构造一个字符串的函数 以前一直没看懂方法描述 注意! charsetName是用来解码byte数组的 ,以前总认为这是字符串的输出编码 ,但其实是指定byte的源编码 即如果 这个byte数组代表的是utf-8编码的字符串 这里就应该填 utf-8 这样byte数组会转为 Unicode的 byte数组 然后再构造出 Unicode编码的字符串 所以输出的字符串编码是Unicode

在这里插入图片描述
这里同样 charsetName 不是说 当前字符串的编码 而是要生成的目标编码 因为当前字符串固定都是Unicode 用不着你指定。

所以编码转换的流程就简单了 ,正确读取字符串–》内存里统一 Unicode --》获取目标需要的编码 当然 JVM的显示编码会默认为GBK 或者 utf-8的 所以 涉及流的操作 不要用字符流 用字节流 。

下面是简单的一个utf-8文件转gbk文件的方法

public static void uft82Gbk(File f){
        try {
        	//读取byte数组 不直接读取字符串
            byte[] bs = FileUtils.readFileToByteArray(f);
			
			//文件编码是utf-8 所以 bs数组的编码就是utf-8  对bs使用utf-8解码 生成Unicode字符串
            String utf8=new String(bs,"UTF-8");
            //将Unicode字符串 编码GBK的byte数组 输出到文件里
            FileUtils.writeByteArrayToFile(new File(f.getParentFile(),f.getName()+".bak"),utf8.getBytes("GBK") );
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

反之亦然 其实只要理解原理流程就不会乱了 记住 内存里只有Unicode 编码即可 而Unicode是万国码 可以随意转换任何编码不乱码 .而存储里的编码是乱七八糟的 .转码只要到Unicode去走一趟即可.
只是任何操作小心损坏原本的编码文件 比如原本是utf-8的文件 强行用notepad++转成了GBK 而且保存了下,这时 代表utf-8的byte数组已经被改变了,很多乱码掉了,这时就回天乏术了 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值