- 浏览: 374554 次
文章分类
最新评论
-
strchi:
这个网站,什么都没有了
做小说搜索网站,这个是不是有可能会侵权的呢? -
从此醉:
楼主倒是给出解决办法啊
Java虚拟机支持的最大内存限制 -
kjmmlzq19851226:
又要增强客户体验,又要降低伪造攻击的概率,╮(╯▽╰)╭,程序 ...
Web安全测试之跨站请求伪造(CSRF)篇(图) -
zhangxinze:
linux下使用Java获取客户端ip地址?大家有何高见,我现 ...
怎样用Java来获取真实的IP地址 -
k_kid9157:
学习 感谢分享:-)
log4j的ConversionPattern参数的格式含义
一、Java编码是怎么回事?
对于使用中文以及其他非拉丁语系语言的开发人员来说,经常会遇到字符集编码问题。对于Java语言来说,在其内部使用的是UCS2编码(2个字节的Unicode编码)。这种编码并不属于某个语系的语言编码,它实际上是一种编码格式的世界语。在这个世界上所有可以在计算机中使用的语言都有对应的UCS2编码。
正是因为Java采用了UCS2,因此,在Java中可以使用世界上任何国家的语言来为变量名、方法名、类起名,如下面代码如下:
{
public String 雄起()
{
return "中国雄起";
}
}
中国 祖国 = new 中国();
System.out.println(祖国.雄起());
哈哈,是不是有点象“中文编程”。实际上,也可以使用其他的语言来编程,如下面用韩文和日文来定义个类:
{
public void スーパーマン() { }
}
实际上,由于Java内部使用的是UCS2编码格式,因为,Java并不关心所使用的是哪种语言,而只要这种语言在UCS2中有定义就可以。
在UCS2编码中为不同国家的语言进行了分页,这个分页也叫“代码页”或“编码页”。中文根据包含中文字符的多少,分了很多代码页,如cp935、cp936等,然而,这些都是在UCS2中的代码页名,而对于操作系统来说,如微软的windows,一开始的中文编码为GB2312,后来扩展成了GBK。其实GBK和cp936是完全等效的,用它们哪个都行。
二、Java编码转换
上面说了这么多,在这一部分我们做一些编码转换,看看会发生什么事情。
先定义一个字符串变量:
String gbk = "中国"; // “中国”在Java内部是以UCS2格式保存的
用下面的语言输出一定会输出中文:
System.out.println(gbk);
实现上,当我们从IDE输入“中国”时,用的是java源代码文件保存的格式,一般是GBK,有时也可是utf-8,而在Java编译程序时,会不由分说地将所有的编码格式转换成utf-8编码,读者可以用UltraEdit或其他的二进制编辑器打开上面的“中国.class”,看看所生成的二进制是否有utf-8的编码(utf-8和ucs2之间的转换非常容易,因为utf-8和ucs2之间是用公式进行转换的,而不是到代码页去查,这就相当于将二进制转成16进制一样,4个字节一组)。如“中国”的utf-8编码按着GBK解析就是“涓 浗”。如下图所示。
如果使用下面的语言可以获得“中国”的utf-8字节,结果是6(一个汉字由3个字节组成)
System.out.println(gbk.getBytes("utf-8").length);
下面的代码将输出“涓 浗”。
System.out.println(new String(gbk.getBytes("utf-8"), "gbk"));
由于将“中国“的utf-8编码格式按着gbk解析,所以会出现乱码。
如果要返回中文的UCS2编码,可以使用下面的代码:
System.out.println(gbk.getBytes("unicode")[2]);
System.out.println(gbk.getBytes("unicode")[3]);
前两个字节是标识位,要从第3个字节开始。还有就是其他的语言使用的编码的字节顺序可能不同,如在C#中可以使用下面的代码获得“中国“的UCS2编码:
String s = "中";
MessageBox.Show(ASCIIEncoding.Unicode.GetBytes(s)[0].ToString());
MessageBox.Show(ASCIIEncoding.Unicode.GetBytes(s)[1].ToString());
使用上面的java代码获得的“中“的16进制UCS2编码为4E2D,而使用C#获得的相应的ucs2编码为2D4E,这只是C#和Java编码内部使用的问题,并没有什么关系。但在C#和Java互操作时要注意这一点。
如果使用下面的java编码将获得16进制的“中”的GBK编码:
System.out.println(Integer.toHexString(0xff & xyz.getBytes("gbk")[0]));
System.out.println(Integer.toHexString(0xff & xyz.getBytes("gbk")[1]));
“中”的ucs2编码为2D4E,GBK编码为D6D0
读者可访问如下的url自行查验:
http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT
当然,感兴趣的读者也可以试试其他语言的编码,如“人类”的韩语是“인간의”,如下面的代码将输出“인간의”的cp949和ucs2编码,其中cp949是韩语的代码页。
System.out.println(Integer.toHexString(0xff & korean.getBytes("unicode")[2]));
System.out.println(Integer.toHexString(0xff & korean.getBytes("unicode")[3]));
System.out.println(Integer.toHexString(0xff & korean.getBytes("Cp949")[0]));
System.out.println(Integer.toHexString(0xff & korean.getBytes("Cp949")[1]));
上面代码的输出结果如下:
c7
78
c0
ce
也就是说“인”的ucs2编码为C778,cp949的编码为C0CE,要注意的是,在cp949中,ucs2编码也有C0CE,不要弄混了。读者可以访问下面的url来验证:
http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP949.TXT
http://www.bt285.cn/content.php?id=1196863
Java支持的编码格式
三、属性文件
Java中的属性文件只支持iso-8859-1编码格式,因此,要想在属性文件中保存中文,就必须使用UCS2编码格式("uxxxx),因此,出现了很多将这种编码转换成可视编码和工具,如Eclipse中的一些属性文件编辑插件。
实际上,"uxxxx编码格式在java和C#中都可以使用,如下面的语句所示:
String name= ""u7528"u6237"u540d"u4e0d"u80fd"u4e3a"u7a7a" ;
System.out.println(name);
上面代码将输出“用户名不能为空”的信息。将"uxxxx格式显示成中文非常简单,那么如何将中文还原成"uxxxxx格式呢?下面的代码完成了这个工作:
byte[] uncode = ss.getBytes("Unicode");
int x = 0xff;
String result ="";
for(int i= 2; i < uncode.length; i++)
{
if(i % 2 == 0) result += "\\u";
String abc = Integer.toHexString(x & uncode[i]);
result += abc.format("%2s", abc).replaceAll(" ", "0");
}
System.out.println(result);
上面的代码将输出如下结果:
\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a
好了,现在可以利用这个技术来实现一个属性文件编辑器了。
四、Web中的编码问题
大家碰到最多的编码问题就是在Web应用中。先让我们看看下面的程序:
<%@ page language="java" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
<form action="servlet/MyPost" method="post">
<input type="text" name="user" />
<p/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
下面是个Servlet:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyPost extends HttpServlet
{
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String user = request.getParameter("user");
System.out.println(user);
}
}
如果中main.jsp中输入中文后,向MyPost提交,在控制台中会输出“ä¸å½”,一看就是乱码。如果将IE的当前编码设成其他的,如由utf-8改为gbk,仍然会出现乱码,只是乱得不一样而已。这是因为客户端提交数据时是根据浏览器当前的编码格式来提交的,如浏览器当前为gbk编码,就以gbk编码格式来提交。 这本身是不会出现乱码的,问题就出在Web服务器接收数据的时候,HttpServletRequest在将客户端传来的数据转成ucs2码上出了问题。在默认情况下,是按着iso-8859-1编码格式来转的,而这种编码格式并不支持中文,所以也就无法正常显示中文了,解决这个问题的方法是用和客户端浏览器当前编码格式一致的编码来转换,如果是utf-8,则在doPost方法中应该用以下的语句来处理:
request.setCharacterEncoding("utf-8");
为了对每一个Servlet都起作用,可以将上面的语句加到filter里。
另外,我们一般使用象MyEclipse一样的IDE来编写jsp文件,这样的工具会根据pageEncoding属性将jsp文件保存成相应的编码格式,但如果要使用象记事本一样的简单的编辑器来编写jsp文件,如果pageEncoding是utf-8,而在默认时,记事本会将文件保存成iso-8859-1(ascii)格式,但在myeclipse里,如果文件中有中文,它是不允许我们保存成不支持中文的编码格式的,但记事本并不认识jsp,因此,这时在ie中就无法正确显示出中文了。除非用记事本将其保存在utf-8格式。如下图:
http://blog.csdn.net/wangdei/archive/2008/10/07/3030758.aspx
发表评论
-
推荐JS压缩工具ESC
2009-01-08 20:13 2163昨天将CheckBox转Text的代码从HTML中剥离出来之 ... -
怎样用Java来获取真实的IP地址
2009-01-06 13:05 7480在JSP里,获取客户端的IP地址的方法是:request.ge ... -
CLOSE_WAIT状态的生成原因[转]
2008-12-16 14:50 3070CLOSE_WAIT状态的生成原因首先我们知道,如果我们的Cl ... -
tcp相关状态
2008-12-16 14:42 1311客户端口实际上就是从本机访问其它计算机服务时打开的源端 ... -
网站前端优化一些小经验
2008-12-04 20:32 962着第3届bt论坛的顺利结 ... -
Base64基础(2)
2008-12-02 10:19 1344url: http://zh.wikipedia.org/wi ... -
什么是Base64以及sun.misc.BASE64Decoder的用法
2008-11-24 15:10 4861Base64是网络上最常见的用于传输8Bit字节代码的编码方式 ... -
Regex的一些常用例子
2008-11-11 12:37 1357import java.util.HashMap; imp ... -
值得收藏的健康知识
2008-11-03 11:53 1563不要死于无知。 不要拿 ... -
java的File#renameTo(File)方法的陷井
2008-10-27 10:17 1688以前我一直以为File#renameTo(File)方法与OS ... -
垂直搜索的信息分类如何做
2008-10-24 10:09 1498垂直搜索的优势就在 ... -
Twitter的增容处理
2008-10-21 12:00 1006文/Patrick Joyce译/杨昊 由于之前 ... -
一步步图解 Tomcat 体系结构
2008-10-08 10:42 2311Apache Tomcat 是一款非常著名的开源 Servle ... -
JAVA分布式应用中使用XML数据
2008-09-24 15:14 1325可扩展标记语言(XML) ... -
红黑树(red-black tree)算法,附AVL树的比较
2008-09-03 15:01 14160红黑树的定义 正如在CLR ... -
状态对象:数据库的替代者
2008-09-03 10:39 916这是一个实战中非常重 ... -
一个计算机专业学生几年的编程经验汇总
2008-08-02 21:04 1418想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈 ... -
UUID的介绍与使用
2008-07-30 17:24 2930一.UUID的介绍:UUID又称为通用唯一标识符,是一个128 ... -
htmlparser使用指南
2008-07-05 14:07 3028需要做一个垂直搜索引擎,比较了nekohtml和htmlp ... -
Apache安装配置与优化
2008-07-04 15:06 1669文针对apache web服务器的安装配置收集有效的一些经验 ...
相关推荐
本篇文章将深入探讨这个问题,并提出一种另类的解决方案——利用JNI(Java Native Interface)进行加密和解密操作来规避乱码问题。 首先,我们需要理解为什么会出现中文乱码。这通常与字符编码有关,Java和JSP默认...
本文主要研究了Java中中文编码问题,探讨了Java SE序的运行原理,分析了Java单机程序、在服务器上运行JSP、Servlets或EJB等产生中文乱码的原因,并提出了相应的解决方案。 一、Java中文编码问题的来源 Java程序...
1. **哈弗曼编码原理**: 哈弗曼编码是一种基于字符频率的变长前缀编码,通过构建最小带权路径长度的二叉树(哈弗曼树),为每个字符分配唯一的路径,即编码。频率高的字符拥有较短的编码,频率低的字符编码较长,...
但要记住,关键在于理解字符编码原理,并在每个涉及字符编码转换的地方都给予足够的关注。同时,养成良好的编码习惯,始终指定编码,而不是依赖默认值,是避免乱码问题的重要步骤。 对于更复杂的情况,例如与第三方...
"Android-Kotlin编码难题及解决方案"这个主题涵盖了Kotlin在Android开发中的常见问题及其解决策略。 1. **类型安全与空安全**:Kotlin的一个显著优势是它的空安全特性。在处理可能为null的对象时,Kotlin强制进行...
总的来说,这个基于Huffman编码的Java压缩软件是一个完整的数据压缩解决方案,它从构建Huffman树到生成编码,再到实际的压缩操作,都体现了Huffman编码的理论精髓。通过阅读和理解这些源代码,我们可以更深入地学习...
总的来说,Base64编码在Java中是一个常见的需求,无论是官方API还是第三方库,都有成熟的解决方案。在实际开发中,建议优先使用Java标准库的`java.util.Base64`,因为它具有更好的兼容性和稳定性。对于需要兼容老...
对于编码和解码,理解底层源码可以帮助我们更高效地解决编码问题,例如,当遇到乱码问题时,通过阅读源码我们可以找到问题所在,并定制解决方案。 “工具”则意味着可能有一些实用的库或框架可以帮助我们进行编码和...
在Java开发中,生成Word文档是一项常见的需求,例如在报告生成、数据导出或合同制作等场景。...实际应用中,根据项目特性和需求选择合适的库,并灵活运用其提供的功能,就能实现Java生成Word文档的“完美解决方案”。
### Java反序列化回显解决方案 #### 前言 在信息安全领域,特别是渗透测试与安全研究中,Java反序列化漏洞是一个常见的攻击点。利用此类漏洞,攻击者可以执行远程代码(RCE),对系统造成严重影响。然而,通常情况...
但值得注意的是,随着国际化需求的日益增长,Java系统可能需要支持多种语言,这就要求开发者在设计系统时考虑更为灵活的编码解决方案。例如,可以使用`Locale`和`ResourceBundle`来支持多种语言的动态切换,这样即便...
#### 三、问题根源与解决方案 **问题根源**: - 微服务架构下系统间的复杂依赖关系导致了故障的扩散效应。 - 服务间的依赖关系导致了服务质量的下降。 - “雪崩效应”:单个服务的故障可能会迅速蔓延到整个系统。 -...
在本课程"Java_我的代码解决方案Andrei Neagoies在线udemy课程掌握编码面试数据结构算法.zip"中,Andrei Neagoies旨在帮助学员深入理解并掌握编程面试中常见的数据结构和算法,以便在实际面试中脱颖而出。...
总的来说,`JAVA 转换字符编码工具`解决了在Java开发中常见的编码问题,提供了一种自动化或半自动化的解决方案,使得开发者能够在处理各种编码格式的数据时更加得心应手。`DealMapStruct.java`和`CheckDirectionary....
通过该项目的设计与实现,不仅加深了对哈夫曼编码原理的理解,还掌握了其实现方法。实际应用表明,哈夫曼编码在数据压缩方面表现出了优秀的性能,尤其是在处理大量文本数据时,能够显著减少存储空间的需求。此外,...
#### 二、解决方案详解 为了解决这一问题,可以通过自定义`ZipOutputStream`和`ZipInputStream`类来实现对中文文件名的支持。下面将详细介绍具体的实现步骤: ### 1. 自定义ZipOutputStream类(CnZipOutputStream) ...
5. **文档**:描述中提到有一个简单的说明文档,这个文档通常会包含如何编译和运行程序的步骤,以及可能遇到的问题和解决方案。这对于初学者尤其有用,帮助他们更好地理解代码的工作原理。 总的来说,"计算器的Java...
这种组合提供了灵活的控制层、松散耦合的服务层以及高效的持久化层,构成了Java EE轻量级开发的典型解决方案。 本教材源码的第二章主要介绍了Struts2的基础知识,可能包括Action的创建、配置文件的编写、OGNL的使用...
本篇文章将针对JAVA语言中常见的问题及其解决方案进行深入探讨,帮助开发者更好地理解和解决这些问题。 首先,我们要理解JAVA的核心特性。JAVA是一种面向对象的编程语言,它的特点是跨平台性、安全性和稳定性。这...
我花了一些时间自己动手实验了一把,虽然没有洞悉编码,解码这些底层原理,但是解决实际问题应该足够了。这里主要针对java web项目中的文乱码问题。 从浏览器采用form方式提交数据到服务器,可以分为post和get...