JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。
为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章:
第一篇:JAVA字符编码系列一: Unicode,GBK,GB2312,UTF-8概念基础
第二篇:JAVA字符编码系列二: Unicode,ISO-8859,GBK,UTF-8编码及相互转换
第三篇:JAVA字符编码系列三: Java应用中的编码问题

 

 
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
 
1、函数介绍
在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:
1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 
 
2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换
public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException
 
2、Unicode与各编码之间的直接转换
下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换
1)Unicode和GBK
测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串
String - GBK 〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4
ByteArray - GBK 〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)
 
2)Unicode和UTF-8
测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串
String - UTF-8 〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87
ByteArray - UTF-8 〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)
3)Unicode和ISO-8859-1
测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串
String - ISO-8859-1 〉ByteArray:/u0061/u4E2D/u6587(a中文)-〉0x61 0x3F 0x3F
ByteArray - ISO-8859-1 〉String:0x61 0x3F 0x3F-〉/u0061/u003F/u003F(a??)
3、Unicode与各编码之间的交叉转换
在上面直接转换中,由字符串(Unicode)生成的字节数组,在构造回字符串时,使用的是正确的编码集合,如果使用的不是正确的编码集合会怎样呢?会正确构造吗?如果不能正确构造能有办法恢复吗?会信息丢失吗?
 
下面我们就来看看这种情况,这部分可以说明在某些情况下虽然我们最终正确显示了结果,但其间仍然进行了不正确的转换。
 
1)能够正确显示的中间不正确转换
我们知道String - GBK 〉ByteArray - GBK 〉String是正确的,但如果我们采用String - GBK 〉ByteArray - ISO-8859-1 〉String呢?通过测试结果如下:
String - GBK 〉ByteArray - ISO-8859-1 〉String:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????)
 
这时我们得到的字符串为?乱码“a????”,但是通过继续转换我们仍然可以复原回正确的字符串“a中文”,过程如下:
String - GBK 〉ByteArray - ISO-8859-1 〉String - ISO-8859-1 〉ByteArray - GBK 〉String
对应:/u0061/u4E2D/u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u00D6/u00D0/u00CE/u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉/u0061/u4E2D/u6587(a中文)
 
也就是我们在首次构造字符串时,我们用了错误的编码集合得到了错误的乱码,但是我们 通过错上加错,再用错误的编码集合获取字节数组,然后再用正确的编码集合构造,就又恢复了正确的字符串。这时就属于是“能够正确显示的中间不正确转换”。在Jsp页面提交数据处理时常常发生这种情况。
 
此外能够正确显示的中间不正确转换还有:
String - UTF-8 〉ByteArray - ISO-8859-1 〉String - ISO-8859-1 〉ByteArray - UTF-8 〉String
和
String - UTF-8 〉ByteArray - GBK 〉String - GBK 〉ByteArray - UTF-8 〉String
对应:/u0061/u4E2D/u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u6D93/uE15F/u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉/u0061/u4E2D/u6587(a中文)
 
4、编码过程中错误诊断参考
1)一个汉字对应一个问号
在通过ISO-8859-1从字符串获取字节数组时,由于一个Unicode转换成一个byte,当遇到不认识的Unicode时,转换为0x3F,这样无论用哪种编码构造时都会产生一个?乱码。
2)一个汉字对应两个问号
在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。
若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用GBK构造);
若是通过UTF-8构造则会产生Unicode字符"/uFFFD",不能恢复,若再通过String-UTF-8〉ByteArray-GBK〉String,则会出现杂码,如a锟斤拷锟斤拷
3)一个汉字对应三个问号
在通过UTF-8从字符串获取字节数组时,由于一个Unicode转换成三个byte,如果此时用ISO-8859-1构造字符串就会出现三个问号;用GBK构造字符串就会出现杂码,如a涓枃。
 

 引用网址:http://blog.youkuaiyun.com/qinysong/article/details/1179489

字符与Unicode码转换 Java 在Java中,我们经常需要进行字符与Unicode码之间的转换。字符是指可打印的文本符号,而Unicode码是用于表示字符的标准编码系统。在本篇文章中,我将向您展示如何在Java中实现字符与Unicode码之间的转换,并提供相应的源代码示例。通过以上的代码示例,您可以在Java中实现字符与Unicode码之间的转换。在进行字符与Unicode码转换时,您可能需要考虑字符编码的相关问题。最后,我们打印出字符和其对应的Unicode码。要将Unicode码转换为字符,可以使用Java中的转义序列或使用。 阅读详情

相关推荐

字符与Unicode码转换的实现(Java)

Unicode码的范围:Unicode码的范围是0~0x10FFFF,可以表示几乎所有的字符。在Java中,char类型采用UTF-16编码,可以表示Unicode码范围内的字符。下面是一个示例代码,演示了如何将字符转换为Unicode码,以及如何将Unicode码转换为字符。上述示例代码只是演示了基本的字符与Unicode码转换,实际开发中可能会涉及更复杂的字符串操作和编码处理。以上代码展示了两个简单的示例,通过类型转换和基本的数值操作,实现了字符与Unicode码之间的转换。

ByteProwl的博客 707

Java Unicode和中文编码转换

今天在开发项目的时候,第三方提供的接口返回的数据是经过Unicode编码的,我们使用的时候多有不便,所以经过代码将Unicode解码才能使用,故记录一下使用Java进行Unicode和中文的互转。通常我们在安全优先级不是特别高但是又不想使用明文的情况下就可以使用这中方式进行加密、解密。解码:将Unicode的编码转换为中文da。加密:将中文字符转换成Unicode字符。

lly576403061的博客 3930

DEV-C++调试设置

       昨天用C/C++去考了CSP,结果用DEV-C++调试总是闪退,按照我的记忆打开了调试参数,迷迷糊糊搞了一通,还是没办法调试,难受了几个小时。所以今天痛下决心,一定要写下DEV-C++设置调试的过程,警示自己! 解决步骤 1.打开DevC++找到上方工具栏 2.点击选择编译选项,再按下图所示设置即可

懒羊羊的快乐小屋 1029

【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

http://blog.youkuaiyun.com/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章: 第

jinhong_lu的博客 343

从网格划分到端口接地:一份给ADS新手的Momentum RF仿真避坑实操指南

本文为ADS新手提供Momentum RF仿真的实用指南,涵盖网格划分、端口接地、特殊结构处理等关键设置技巧。通过30-50 cells/λ原则、1/10波长限制等黄金法则,帮助用户平衡仿真精度与效率,避免常见错误,提升电磁仿真结果的准确性。

weixin_33692284的博客 506

基于任务的后勤智能体:三段构建与演进设计探究

这是系统智能化的核心难点。例如,对于一个“加强连级滩头阵地防御”子任务,系统会根据防御时长、预期敌军攻击强度、地形等因素,计算出所需的弹药(不同弹种的具体数量)、构筑工事的器材、人员的给养和饮水量、以及医疗救护的药品和血包数量。首先进行分词、词性标注等基础处理,然后利用在军事语料库上训练的命名实体识别(NER)模型,提取出关键实体,如任务类型(“夺控作战”)、作战对象(“Y岛”)、时间约束(“D日H时”、“24小时内”)、成功标准(“建立稳固滩头阵地”)、保障重点(“弹药充足”、“及时救治”)等。

weixin_49042442的博客 1088

JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换   1、函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为: 1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换 public byte[] getBytes(String charsetName...

小怪兽叔叔 143

2024-12月js逆向案例-sensor-data之vmp字段之akamai_2/3.0-(下)

akamai2/3的vmp字段逆向分析

十一姐的博客 3146

iso转gbk java_【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换...

http://blog.youkuaiyun.com/qinysong/article/details/1179489这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考。为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问题,特别是乱码问题,我觉得组成一个系列来描述和分析更好一些,包括三篇文章:第二篇:JAVA字符编...

weixin_36308543的博客 232

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 818

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1381
上一篇: MySql数据定时备份
下一篇: linux入门(安装)
maxabe
博客等级 码龄18年 8粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值