字符编码合集

本文详细介绍了字符集和编码的区别,展示了如何查看和修改系统默认编码,以及如何处理文件编码转换。在Java中,源代码、class文件和字符串的编码各有特点,虚拟机内部使用UTF-16。同时,讨论了HTTP请求和响应中的编码处理,以及URL编码与解码的问题,强调了统一编码标准的重要性以避免乱码。并提到了Tomcat配置以处理URL解码时可能出现的问题。
摘要由CSDN通过智能技术生成
  1. 区分字符集和编码的区别
  2. 查看本机默认编码(新建一个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
    如若文件名展示乱码,表示文件名编码和展示编码不一致,展示编码取系统默认编码,或者展示程序制定的编码,改成一致即可。
  3. 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指定
  • 显示编码:如浏览器 指定
  1. 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传递时的中文问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值