1,编码只是表示字符一种方式,字符还是那个字符,只不过其数值表示的不一样而已。字体、样式和用什么编码表示字符没有任何关系。不可能存在UTF-8达不到的效果。除非你处理字符串的方式有问题,例如后台程序写死了一个中文等于两个字节。或者你的css文件编码有问题。例如html用了UTF-8编码,而css文件用了GB编码,又没有用charset指定css的编码等等。而对于前台HTML来说,无论页面什么编码,JavaScript内建的字符串类型是UTF-16编码的,不存在任何问题。 UTF-8的编码是变长的,从1字节(兼容ASCII)到4字节不等。用UTF-8的好处是它能表示任意Unicode字符,而GBK/GB2312做不到,除了不能表示一些外国文字外,一些古老的中文(如康熙字典里的一些字)也不能表示,但在Unicode里就有。后来发展出的GB18030可以表示任意Unicode字符,也是变长编码,兼容GBK,最长4个字节。编码问题是很麻烦的事情,尤其是同一个系统中存在多种编码的情况。由于每种编码表示的字符范围有限,所以转码过程中有可能丢失字符信息。因此,如果你的程序着眼于全球市场,而不仅仅局限于中文用户,或者未来发展有这方面的需求,那么就应该坚持程序内部都使用同一种Unicode编码,如UTF-8,这样以后程序在国际化时就不会存在什么编码问题。

来源: http://news.csdn.net/n/20080509/115815.html

2,ISO-8859-1. 这套标准完全和ASCII兼容,它使用8位二进制表示一个字符 —---

刚好一个字节,其中最高位是0时的解释和ASCII一样,但最高位是1时则用于定义其它字符,这样就在保证和

ASCII兼容的同时又扩展了ASCII,可以多表示字符啦

在Java中,String的getBytes()方法就是对特定的字符串(unicode)按照给定的字符集进行编码(encode),new String()则可以按照某个字符集将字节流转换回unicode(decode)之所以你会经常看到new String(text.getBytes("ISO-8859-1"),"GBK")这句代码,是因为一个GBK的字节流被错误地以ISO-8859- 1的方式转换为String(unicode)了!如果系统误以为是其它编码格式,就有可能再也转换不回来了,因为编码转换并不是负负得正那么简单的

4,ANSI和Unicode big endia:

我们在Windows系统中保存文本文件时通常可以选择编码为ANSI、Unicode、Unicode big endian

和UTF-8,这里的ANSI和Unicode big endia是什么编码呢?

Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode

big endian),EF、BB、BF(UTF-8)

例如"联通",如果保存为Unicode,则hex为ff fe 54 80 la 90

如果保存为Unicode big endian,则hex为fe ff 80 54 90 la

也就是说,在windows里,所谓的Unicode其实是Unicode little endian

ANSI:

对于简体中文windows操作系统,ANSI就是GBK

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码

说UCS-4中,高两个字节为0的码位被称作BMP

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

所以目前UNICODE=UCS-2

big endian和little endian

big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big

endian。如果将49写在前面,就是little endian。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

UTF编码

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:UCS-2编码(16进制)UTF-8 字节流(二进制)

0000 - 007F0xxxxxxx

0080 - 07FF110xxxxx 10xxxxxx

0800 - FFFF1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx

10xxxxxx 10xxxxxx。将6C49写成二进制是:0110

110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001

10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit在打开utf-8编码的文本文件时会自动转换为UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是Hex

Workshop。

UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不

小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为

UTF-16(确切的说,是utf16-BE)和UCS-2(也就是我们通常所说的UNICODE)基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字

节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”

还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO

WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO

WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF

BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。UTF-8 是 1-4 字节变长编码方案;

JVM用的是UCS-2

String其实是由char拼起来的,对char进行int后得到的数字就是unicode码16进制换算后的值

例如

char   int    Unicode

1      49     0031

中    20013   4e2d

国    22269   56fd

Integer.toHexString((int)str.charAt(i))

Windows的内码也是Unicode

从http://www.fmddlmyy.cn/text6.html受益良多。

6,http://www.javaeye.com/topic/398782比较形象,

提到一个很著名的奇怪现象:当你在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!

但有错误

UTF应该是UCS Transformation Format,其中的T不是Transfer

7,

ASCII码表

ISO-8859-1收录的字符除ASCII收录的字符外,还包括一些其他语言的文字符号和一些控制字符。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。

因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。Latin1是ISO-8859-1的别名

法语及芬兰语本来也使用ISO/IEC 8859-1来表示。但因它没有法语使用的 œ、Œ、 Ÿ 三个字母及芬兰语使用的 Š、š、Ž、ž ,故于1998年被ISO/IEC 8859-15所取代。(ISO 8859-15同时加入了欧元符号)

http://blog.cathayan.org/item/1765

http://hedong.3322.org/archives/000355.html

java编码用gbk还是utf-8_utf-8还是GBK、java的编码问题相关推荐

  1. 编码全解:从ASCII/ISO-8859/GB2312/GBK到Unicode的UCS-2/UCS-4/UTF-8/UTF-16/UTF-32

    1.ASCII编码 为了能在电报.打印机.计算机等电信设备上进行信息交换,就必须为不同的设备制定统一的编码格式.早期的电信设备字符编码基本都是使用6位编码.1963年美国国家标准协会(ANSI)制定并 ...

  2. 字符集编码详解【ASCII 、GB2312、GBK、GB18030、unicode、UTF-8】(转)

    ASCII字符集编码 ASCII码是7位编码,编码范围是0x00-0x7F.ASCII字符集包括英文字母.阿拉伯数字和标点符号等字符.其中0x00-0x20和0x7F共33个控制字符. 只支持ASCI ...

  3. java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312

    java跟python类似的做法,在java中字符串的编码是java修改过的一种Unicode编码,所以看到java中的字符串,心理要默念这个东西是java修改过的一种Unicode编码的编码. pa ...

  4. java中编码问题_[干货预警]一次搞懂Java中的编码问题

    编码问题一直是一个困扰程序员的问题,尤其是对于java程序员.因为java的跨平台特性,经常需要在多个编码之间进行转换. 下面详细讲一讲java中的编码问题 一.为什么要编码 长话短说,原因如下: 1 ...

  5. java解析消息头代码_javaWeb项目-文件下载的消息头和编码问题

    一.问题: 做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置? 二.解决: 1.例子 //设置响应的消息头 response.setCont ...

  6. 深入理解:cmd下java命令启动JVM运行class文件时,可以自动识别不同编码编译后的class文件并加之运行

    cmd下java命令启动JVM运行class文件时,可以自动识别不同编码编译后的class文件并加之运行 总结如下: 一:程序源代码以GBK格式保存时: 二:程序以源代码UTF-8无BOM格式保存时: ...

  7. word文档转html怎么设置utf-8,word转utf 如何将word改为utf-8编码

    在word的另存为界面可以设置保存文件为utf-8编码,具体操作请参照以下步骤. 1.在电脑上打开目标word文档,然后点击软件界面左上角的"office按钮"图标. 2.然后在其 ...

  8. PHP搜索utf和gbk,php中判断是gbk还是utf

    // 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...

  9. python 中文编码类型 gb2312 gb180_常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、UTF-8、unicode...

    http://blog.csdn.net/zhoubl668/article/details/6914018 ASCII ASCII码是7位编码,编码范围是0x00-0x7F.ASCII字符集包括英文 ...

  10. java 图片压缩 base64_图片改变像素,宽高,Base64编码处理

    1.改变图片像素 private void setAlpha(String os) { /** * 增加测试项 * 读取图片,绘制成半透明,修改像素 */ try { ImageIcon imageI ...

最新文章

  1. 推荐Scum敏捷开发的几款工具
  2. mysql创建表选择字段的时候下尽量小
  3. Java基础与提高干货系列——Java反射机制
  4. 源码解析:Git的第一个提交是什么样的?
  5. VMware与KVM全方面对比
  6. 浏览器窗口控制---使用localStorage
  7. M1芯片版mac软件安装出现异常怎么办?解决方法来了
  8. [置顶] 使用Joson的格式字符串在Socket中通讯时数据格式的转换
  9. pycharm 初级使用文档
  10. SQL Server高级查询之常见数据库对象(触发器)第五章节
  11. 银行比赛计算机录入技巧,“金手指”、翻打传票、汉字录入……恒丰银行劳动技能竞赛现场高手过招精彩不断...
  12. 老王的JAVA基础课:第1课 计算机基础知识
  13. 说实话,Jenkins 真得牛逼!只是你不会用而已~
  14. BootStrap详细应用-小bai前端框架进阶秘籍
  15. P1567 统计天数(洛谷)
  16. win10亮度进度条不见了
  17. Kotlin中的面向对象(二)
  18. win10桌面计算机怎么显示器,一台电脑两个显示器如何设置
  19. DataBinding使用指南(一)DataBinding基本使用,双向绑定,ListView RecycleView使用
  20. 创业思维分享优点(创业方法创业思维)

热门文章

  1. PS教程淘宝美工平面设计入门自学课 photoshop软件零基础视频大全
  2. 大学追忆录(天空晴朗的梦)
  3. 如何从CPU顶盖获取有用信息
  4. 二分类模型AUC评价法
  5. 101-150的质数
  6. 【Proteus仿真】51单片机+DAC0832+LCD1602制作LM317数控直流电源
  7. 广东石油化工学院大学计算机基础,落实广东石油化工学院关于公布2013年度实验课题项目的通知...
  8. Scripting for Testers 测试人员脚本编程教程 Lynda课程中文字幕
  9. 《基于深度学习的自然语言处理》中文PDF+英文PDF+学习分析
  10. Java ssm框架是什么?