因为使用FTP上传和下载文件出现了文件名中文乱码的问题,决定好好研究下字符的编解码问题。编码问题一直很头疼...
因为计算机只认二进制,所以任何文件存储都是用字节码存储的,用notepad++,记事本等软件能正确解码成字符显示的就说明文件是文本文件,如果不能正确解码而出现乱码的话就说明文件是二进制文件,需要特定的软件来打开,比如视频播放软件打开mp4格式文件,需要正确解码。
什么时候会发生编解码问题呢? 当IO(读写本地硬盘,网络IO)时会发生字符的编解码。HTTP请求是URL,cookie,POST表单等参数都是需要编码,web服务器Tomcat来进行解码。
总结就是:
从硬盘读文件: byte[]——>char[]/String 解码
往硬盘写文件: char[]/String——>byte[] 编码
网络IO传输过程中: 需要编码成字节传输
当从网络接收数据: 需要解码成字符串
Java的内部编码是Unicode(utf-16),即字符串内jvm内存里都是以unicode编码存在的,内部有一个unicode的字符集映射表。当发生转码的时候就会从unicode编码的字节流转换为其他编码。unicode兼容utf-8/utf-16不会乱码,转其他编码可能会乱码。
关于计算机编码的一些感悟
关于计算机编码的一些感悟
我关于编解码比较好的文章。
还有从Java内存角度来看编码
Java输入输出流涉及的编码转换问题
Java默认的编码方式










网友评论