- 区分字符集和编码的区别
- 查看本机默认编码(新建一个txt文档,默认utf-8,这个和系统编码不一定有关):
windows:chcp
linux: locale LANG=en_US.UTF-8 修改:/etc/sysconfig/i18n LANG=zh_CN.GBK
重新加载source /etc/sysconfig/i18n
查看文件编码:file 1.txt 1.txt: ISO-8859 text
文件转换编码:iconv -f GBK -t UTF-8 1.txt -o 2.txt
如若文件名展示乱码,表示文件名编码和展示编码不一致,展示编码取系统默认编码,或者展示程序制定的编码,改成一致即可。 - java:
- 源代码文件编码
- class文件编码: javac -encoding 取源代码文件编码,到class中是变种的utf-8
- 虚拟机内编码:utf-16 string字符串定义的即采用utf-16编码,1到2个代码单元表示一个码点,string的length是代码单元长度,1个表情符号长度可能是2
char, whose values are 16-bit unsigned integers representing Unicode code points in the Basic Multilingual Plane, encoded with UTF-16, and whose default value is the null code point (‘\u0000’)。 java中char类型使用16位无符号整数来描述unicode中最早一批收录的字符,这批字符后来被叫作Basic Multilingual Plane(BMP),然后编码表使用的是utf-16。所以,java中单个char类型描述的字符是有限的,单个char只能描述unicode中的BMP范围的码位,也就意味着BMP范围外的字符char是无法表示的。比如表情emoji,要用String保存,string是char数组(java9前)两个char表示一个表情emoji - io流编码:读取时指定 -Dfile.encoding指定
- 显示编码:如浏览器 指定
- http:
客户端:Accept:application/json,text/javascript,*/*;q=0.01
服务端返回:Content-Type:application/json;charset=UTF-8
客户端:Conten-Type:applicaiton/x-www-form-urlencoded;charset=UTF-8
服务端根据编码解析。
Accept-Encoding:gzip,deflate Content-Encoding:gzip
Accept-Language:zh-CN Content-Language:zh-CN
tomcat:Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符.修改配置:<Connector port=“8080” maxThreads=“150” minSpareThreads=“25” maxSpareThreads=“75” enableLookups=“false” redirectPort=“8443” acceptCount=“100” debug=“99” connectionTimeout=“20000” disableUploadTimeout=“true” URIEncoding=“UTF-8”/>
url编码解码,又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。JS原生的escape只是将中文转换为unicode编码,encodeURI或者encodeURIComponent也是对于中文unicode编码的url再编码,js本身没有特性支持gbk的urlencode,大部分的时候我们是通过后台(java,urlencode.encode(“中文”,”gbk”))这样来实现的。
js:url = ‘HelloWorldServlet?star_name=’+encodeURI(encodeURI(“刘德华”));
java:String starName = java.net.URLDecoder.decode(request.getParameter(“star_name”),“UTF-8”);
容器会默认解一次码,采用的编码是容器的默认编码,可能是UTF-8,GBK,也可能是其他编码方式。这与你的应用的编码方式未必会一致。所以你直接获取的话可能会出现乱码。
参考:
HTTP:实体(body)数据
让Java世界中再无乱码!5分钟彻底掌握Java字符编码原理
中文乱码 encodeURI来解决URL传递时的中文问题