java编码用gbk还是utf-8_utf-8还是GBK、java的编码问题
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的编码问题相关推荐
- 编码全解:从ASCII/ISO-8859/GB2312/GBK到Unicode的UCS-2/UCS-4/UTF-8/UTF-16/UTF-32
1.ASCII编码 为了能在电报.打印机.计算机等电信设备上进行信息交换,就必须为不同的设备制定统一的编码格式.早期的电信设备字符编码基本都是使用6位编码.1963年美国国家标准协会(ANSI)制定并 ...
- 字符集编码详解【ASCII 、GB2312、GBK、GB18030、unicode、UTF-8】(转)
ASCII字符集编码 ASCII码是7位编码,编码范围是0x00-0x7F.ASCII字符集包括英文字母.阿拉伯数字和标点符号等字符.其中0x00-0x20和0x7F共33个控制字符. 只支持ASCI ...
- java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312
java跟python类似的做法,在java中字符串的编码是java修改过的一种Unicode编码,所以看到java中的字符串,心理要默念这个东西是java修改过的一种Unicode编码的编码. pa ...
- java中编码问题_[干货预警]一次搞懂Java中的编码问题
编码问题一直是一个困扰程序员的问题,尤其是对于java程序员.因为java的跨平台特性,经常需要在多个编码之间进行转换. 下面详细讲一讲java中的编码问题 一.为什么要编码 长话短说,原因如下: 1 ...
- java解析消息头代码_javaWeb项目-文件下载的消息头和编码问题
一.问题: 做web项目经常提到的一个需求就是页面的文件下载,那么下载的时候在后台为什么要设置响应消息头?为什么这样设置? 二.解决: 1.例子 //设置响应的消息头 response.setCont ...
- 深入理解:cmd下java命令启动JVM运行class文件时,可以自动识别不同编码编译后的class文件并加之运行
cmd下java命令启动JVM运行class文件时,可以自动识别不同编码编译后的class文件并加之运行 总结如下: 一:程序源代码以GBK格式保存时: 二:程序以源代码UTF-8无BOM格式保存时: ...
- word文档转html怎么设置utf-8,word转utf 如何将word改为utf-8编码
在word的另存为界面可以设置保存文件为utf-8编码,具体操作请参照以下步骤. 1.在电脑上打开目标word文档,然后点击软件界面左上角的"office按钮"图标. 2.然后在其 ...
- PHP搜索utf和gbk,php中判断是gbk还是utf
// 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...
- python 中文编码类型 gb2312 gb180_常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、UTF-8、unicode...
http://blog.csdn.net/zhoubl668/article/details/6914018 ASCII ASCII码是7位编码,编码范围是0x00-0x7F.ASCII字符集包括英文 ...
- java 图片压缩 base64_图片改变像素,宽高,Base64编码处理
1.改变图片像素 private void setAlpha(String os) { /** * 增加测试项 * 读取图片,绘制成半透明,修改像素 */ try { ImageIcon imageI ...
最新文章
- 推荐Scum敏捷开发的几款工具
- mysql创建表选择字段的时候下尽量小
- Java基础与提高干货系列——Java反射机制
- 源码解析:Git的第一个提交是什么样的?
- VMware与KVM全方面对比
- 浏览器窗口控制---使用localStorage
- M1芯片版mac软件安装出现异常怎么办?解决方法来了
- [置顶] 使用Joson的格式字符串在Socket中通讯时数据格式的转换
- pycharm 初级使用文档
- SQL Server高级查询之常见数据库对象(触发器)第五章节
- 银行比赛计算机录入技巧,“金手指”、翻打传票、汉字录入……恒丰银行劳动技能竞赛现场高手过招精彩不断...
- 老王的JAVA基础课:第1课 计算机基础知识
- 说实话,Jenkins 真得牛逼!只是你不会用而已~
- BootStrap详细应用-小bai前端框架进阶秘籍
- P1567 统计天数(洛谷)
- win10亮度进度条不见了
- Kotlin中的面向对象(二)
- win10桌面计算机怎么显示器,一台电脑两个显示器如何设置
- DataBinding使用指南(一)DataBinding基本使用,双向绑定,ListView RecycleView使用
- 创业思维分享优点(创业方法创业思维)
热门文章
- PS教程淘宝美工平面设计入门自学课 photoshop软件零基础视频大全
- 大学追忆录(天空晴朗的梦)
- 如何从CPU顶盖获取有用信息
- 二分类模型AUC评价法
- 101-150的质数
- 【Proteus仿真】51单片机+DAC0832+LCD1602制作LM317数控直流电源
- 广东石油化工学院大学计算机基础,落实广东石油化工学院关于公布2013年度实验课题项目的通知...
- Scripting for Testers 测试人员脚本编程教程 Lynda课程中文字幕
- 《基于深度学习的自然语言处理》中文PDF+英文PDF+学习分析
- Java ssm框架是什么?