zoukankan      html  css  js  c++  java
  • java字符编码

    • 位(bit):计算机存储信息的最小单位,音译比特,0和1两个值

    字节(Byte):8个bit一字节,在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。
    日常生活说的比如:1M光纤宽带,指的是1024*1024"位"(bit)而不是不是"字节"(Byte).
    但是文件大小说的是"字节"(Byte),如文件大小是1M,是1024*1024 字节(Byte)
    所以如果你们家安装了电信的100M光纤宽带:下载电影速度的理论极限是:100/8=12.5M(字节)
    字符:计算机中使用的所有文字和符号,在不同的编码中,一个字符所占的字节大小是不一样的。
    如在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。

    • ASCII码 全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”

    只有0~127个字符
    0~31 是控制字符
    32~127是打印字符
    详见 ascii表

    • ANSI码 American National Standard Institite,美国国家标准协会

    ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。也就是说,ANSI码仅在前126个与ASCII码相同,之后的字符全是某个国家语言的所有字符。值得注意的是,两个字节最多可以存储的字符数目是2的16次方,即65536个字符,这对于一个语言的字符来说,绝对够了。还有ANSI编码其实包括很多编码:中国制定了GB2312编码,用来把中文编进去另外,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。

    • Unicode编码

    为了解决不同国家ANSI编码的冲突问题,Unicode应运而生:如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
    Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
    java程序中(内存中)所有的char、String(char数组)都是unicode编码,如“中”字unicode编码是 'u4e2d'是一个16进制的数字,转成10进制是 20013

    • utf-8编码

    Unicode已经可以包含所有国家和地区的文字和符号,为什么还需要utf-8呢?
    原本可以用一个字节存储的英文字母在Unicode里面必须存两个字节(规则就是在原来英文字母对应ASCII码前面补0),这就产生了浪费。utf-8是用来减少浪费的。
    utf-8编码一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

    • gb2312和gbk编码

    gb2312可以认为是ANSI码的一种实现,是对ascii的一个扩展,gbk是对gb2312的扩展

    GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换


    在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8或者GBK等编码。
    用记事本编辑的时候,从文件读取的UTF-8或者GBK字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8或者GBK保存到文件。


    iso8859-1:属于单字节编码,最多能表示的字符范围是0-255

    java中的编码问题
    http://www.cnblogs.com/zj0208/p/7019102.html

    字符编码ANSI和ASCII区别、Unicode和UTF-8区别
    https://blog.csdn.net/xiangxianghehe/article/details/77574965

    URLEncode和URLDecode
    request.getParameter("name")
    request.setCharacterEncoding("字符集") //这里设置的字符集合,只到post请求生效,对get请求无效

    get请求

    浏览器端:get请求?号后含有 非ascaii编码的字符(如果中文,特殊字符等),浏览器 在发送请求时会先 URL encode这些字符(以什么编码encode和浏览器有关)
    这样,整个url就符合url规范了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。
    服务器端(tomcat)是如何将数据获取到进行解码的

    服务端可以设置默认的编码格式。不设置默认为 iso-8859-1, 不建议设置。
    <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>

    post请求
    在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?
    在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用 什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的 URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。


    服务端 request.setCharacterEncoding("字符集") 就会起作用了。

  • 相关阅读:
    HttpClient
    Android子线程访问网络
    PhoneURLConnectGEt
    PhoneHttpGet
    PhoneNote
    SQLite
    书单
    通过Web预测网页出版日期的学习
    LeetCode-Maximum Subarray[dp]
    LeetCode-Triangle[dp]
  • 原文地址:https://www.cnblogs.com/veryvalley/p/10157293.html
Copyright © 2011-2022 走看看