Java中关于乱码的认识和解决办法

前几天在使用中兴的MM7接口开发一个彩信的应用,可是在测试的时候,手机收到的文本内容总是一堆乱码,不管怎么修改参数问题都得不到解决,于是就狠狠的琢磨和研究了下关于编码的内容,最终成功解决了乱码的问题。

我们都知道Java语言使用的是Unicode编码。可是大家是否真的已经理解了这句话的含义? Unicode编码和我们常用的UTF-8,GBK有什么关系呢? 那接下来就来讨论下这个话题。

不知大家还有没想过,我们在Java代码里面定义一个字符串字面量的时候,该字符串在JVM中的编码是什么?  是的,上面也说了Java语言用的是Unicode编码,所以这样定义的字符串字面量自然就是Unicode编码表示的。 然而除了这种程序内部的数据外,我们经常还会从外部获取各种各样的数据让程序处理,例如通过IO从硬盘上读取文件,通过JDBC查询数据库等,而这些数据的编码格式是多种多样的,例如有的可能是UTF-8,有的可能是GBK等,那么这样的一些数据在JVM中又是以什么编码表示的呢?

上面提到了几个问题,现在返回去简单的说说编码,当然这里只是粗略的提及,毕竟网上这方面的内容很多。

我们首先要弄清楚两个概念,“字符集编码”和“编码格式”。所谓“字符集编码”就是由某个组织制定的一张“字符与编号的映射关系表”,例如: 10001 == “我”, 10002 = “们”。 我们所谓的Unicode字符集就是这样的一张关系表。

而UTF-8是一种实现了Unicode字符集中部分字符编码的“编码格式”,它存在目的是为了保存或者传输数据用的。那么既然在字符集中已经有了映射关系了,为什么还要再来编码。原因好几个,例如考虑文件大小的问题,使用效率的问题,和其他字符集区分的问题等。

那么UTF-8编码又是对Unicode字符集中的哪部分编码呢? 就是“字符编号”,例如上面的10001,10002.  而对于UTF-8的编码规则可以网上查阅.

那现在我们就应该清楚了,在JVM中表示字符串“我们”使用的编码为“1000110002”这样的格式,也就是使用的是Unicode的编号。那当我们通过IO将一个以UTF-8编码的文本文件读入内存的时候,很可能我们会使用到这样的代码:

new InputStreamReader(new FileInputStream(file),"UTF-8")

这里指定的“UTF-8”就是文件的编码格式,它的目的是告诉负责解码的对象要按照“UTF-8”的编码格式来解码成JVM使用的Unicode编码。那如果我们这里指定为“GBK”的话,我们所得到的可就是一堆乱码啦。

如果String content = (文件内容) 。 那么这个content在这个时候已经是Unicode编码了。不知道现在为止是否应该明白了些什么。

如果你看到这样的代码:
String msg  = "我是一个字符串" ;
String res = new String(msg.getBytes("utf-8"),"GBK") ;

那这里的res打印出来也就是一堆乱码了。这里的操作过程其实是:
1,将Unicode编码的msg按照UTF-8的编码格式进行编码,从而得到UTF-8编码的字节数组。
2,将字节数组按照GBK的编码格式来解码成Unicode编码的字符
3,可惜UTF-8和GBK不兼容,他们使用了不同的编码集,所以乱码出来啦

在进行http请求的时候,我们需要告诉对方我们发送的数据的编码格式是什么,如果对方按照我们的告知的编码格式来解码,而我们却把错误的编码格式告诉了对方,那么接下来的事情就是对方收到了一堆的乱码。

还有就是我们在进行这样的操作的时候:"我是一个字符串".getBytes(); 可要小心了,这个时候得到的字节数组可是你操作系统默认的编码格式(当然我们还可以在启动的时候指定我们默认的编码格式)。

以上的内容大概的讲了下关于java中编码的问题,也算是一个抛砖引玉的过程,欢迎指正。

时间: 2025-01-02 15:49:53

Java中关于乱码的认识和解决办法的相关文章

java中端口号被占用的解决办法

第一步,命令提示符号,执行命令:netstat -ano 可见,占用1099端口的进程的PID是10460. 第二步,命令提示符号,执行命令:tasklist(通过pid 10460定位) 可见,该占用8080端口的进程是Java.exe第三步,通过任务管理器,终止进程java.exe 第四步,重新启动tomca/或者重新打开一个工程,即可正常启动 ps : Linux系统查看端口的占用进程,例如查看端口8080占用: lsof -i:8080 如果有占用,直接使用kill -9 进程号

mysql保存中文乱码的原因和解决办法

当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心. 也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类似mysql 中文乱码.php mysql 中文乱码.mysql5.5中文乱码.mysql 乱码.mysql乱码问题.mysql jsp 乱码.mysql jdbc 乱码.mysql 查询乱码.mysql 导入数据乱码等一系列问题,到底哪个是自己要找的能解决自己问题的呀?15%的程序员一看就懵了,剩下15

20170514002Oracle 11g R2安装过程中遇到的报错及解决办法

Oracle 11g R2安装过程中遇到的报错及解决办法 1.提示Check if the DISPLAYvariable is set.    Failed<<<< 解决方案: #xhost +  //切换到root用户输入 #su – Oracle  //切换到oracle用户 $./runInstaller  //执行安装程序 xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时, 做为应用程序来说,hostA

php中文乱码问题分析及解决办法

中文乱码问题产生的原因,主要就是字符编码设置问题: 首先,mysql数据库安装的时候字符编码要选择正确,最好选择utf-8比较保险.如果安装时没有设置正确,找到mysql的安装目录,修改my.conf配置文件中的字符设置,打开文件,应该一个是在mysqll下面,一个是在server下面的. 如果是php页面的中文乱码,也就是非数据库查询出来的数据,HTML页面静态的部分出现乱码,应该使用header("content-type:text/html; charset=utf8") 来设定

在项目中导入import javax.servlet 出错解决办法

我们有时会把别人的项目copy到自己这里进行二次开发或者参考学习,有的时候会发生下图的错误,即eclipse项目里我们导入的项目里提示HttpServletRequest 不能引用,会伴随头疼的小红叉出现 具体原因是我们工程里面web-inf/lib目录下少了相应的包:Package javax.servlet.http引起的:通俗且确切的讲就是缺少TOMCAT_HOME\lib下的servlet-api.jar.在别人的机器上他配置了Server,一般都是tomcat,而在拷贝的过程中Serv

IntelliJ IDEA中Maven插件无法更新索引之解决办法

IT草根 WangXu's 代码馆 BLOG Home Archives Resume Links About IntelliJ IDEA中Maven插件无法更新索引之解决办法 By Wang Xu 发表于 2015-12-09 文章目录 1. Maven的仓库.索引 2. IntelliJ IDEA利用索引实现自动补全 3. IntelliJ IDEA中Maven插件配置 4. IntelliJ14.1更新索引失败原因 5. 使用国内Maven仓库的镜像 6. 下载Maven仓库的索引 7. 

jQuery中对checkbox设置checked无用解决办法

1. 对html中的多选框设置选择和取消选择,如  $("#id").attr('checked',true);$("#id").attr('checked',false).如果在调试栏中查看elements属性,可以看出,checked是已经设置成功了的,但是在html中不能表现出来. 2. 解决办法 :用prop设置.prop的值为ture或者false.方法如下: $("#id").prop('checked',true); $("

php中curl不支持https的解决办法

在php程序中使用curl去访问https站点时,报错:Protocol https not supported or disabled in libcurl 该错误信息表示php当时编译时使用的curl库不支持https, 验证方法为你的curl安装目录/bin/curl  -V  显示如下:Protocols: dict file ftp gopher http imap pop3 rtsp smtp telnet tftp这表示curl是不支持 https的 为了支持https,需要下载源

jsp页面中onsubmit=&quot;return checklogin();&quot;报错解决办法

选择Window->Preferences->MyEclipse->Validation 去掉方框里的对号,然后Apply 然后点击Yes->然后再点击ok->Yes,就好了,如果你打开了那个出现错误jsp页面的话,请关掉重现打开就ok啦 jsp页面中onsubmit="return checklogin();"报错解决办法,布布扣,bubuko.com