- 浏览: 779478 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (258)
- J2SE (18)
- J2EE (33)
- AJAX (4)
- JQuery (1)
- DWR (3)
- Linux/Unix (32)
- PHP (1)
- JSF (8)
- Oracle (34)
- JavaScript (17)
- 批处理 (13)
- ASP (7)
- VBScript (3)
- SqlServer (9)
- Ant (1)
- JDBC (1)
- XML (0)
- MySql (0)
- hibernate (9)
- windows (6)
- .net (0)
- 测试 (2)
- 汇编 (2)
- 网络 (13)
- 其它 (11)
- IDE工具 (6)
- freemarker (4)
- 存储过程 (1)
- 生活 (9)
- python (11)
最新评论
-
d99520y:
hdd unlock我这直接提示can't open driv ...
用PC3000和HDD Unlock解笔记本硬盘密码 -
javaersu:
几个学习Shell的不错网站:shell为您提供了对UNIX系 ...
shell脚本实例 -
zh89233:
一段恶意脚本的分析及思考 -
tiancaicao:
hdd unlock老要联网,一联网就说我这破解不了,让我付费 ...
用PC3000和HDD Unlock解笔记本硬盘密码 -
pythoner126com:
不错,学习了,跟这个作者写的有点像,http://www.yi ...
python对文件进行读写操作
1.字节和unicode
java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的,而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,可以用来告诉你,你用的convertor。其中两个很常用的静态函数是
public static ByteToCharConverter getDefault();
public static ByteToCharConverter getConverter(String encoding);
如果你不指定converter,则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。
byte ――〉char:
"你"的gb码是:0xc4e3 ,unicode是0x4f60
String encoding = "gb2312";
byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
结果是什么?0x4f60
如果encoding ="8859_1",结果又是什么?0x00c4,0x00e3
如果代码改为
byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
结果将又是什么?根据平台的编码而定。
char ――〉byte:
String encoding = "gb2312";
char c[] = {'\u4f60'};
CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
结果是什么?0x00c4,0x00e3
如果encoding ="8859_1",结果又是什么?0x3f
如果代码改为
String encoding = "gb2312";
char c[] = {'\u4f60'};
CharToByteConverter converter = CharToByteConverter.getDefault();
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
结果将又是什么?根据平台的编码而定。
很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入,这给我们带来诸多不便。很多程序难得用encoding了,直接用default的encoding,这就给我们移植带来了很多困难。
2.utf-8
utf-8是和unicode一一对应的,其实现很简单
7位的unicode: 0 _ _ _ _ _ _ _
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
大多数情况是只使用到16位以下的unicode:
"你"的gb码是:0xc4e3 ,unicode是0x4f60
0xc4e3的二进制:
1100 ,0100 ,1110 ,0011
由于只有两位我们按照两位的编码来排,但是我们发现这行不通,因为第7位不是0因此,返回"?"
0x4f60的二进制:
0100 ,1111 ,0110 ,0000
我们用utf-8补齐,变成:
1110 ,0100 ,1011 ,1101 ,1010 ,0000
e4--bd-- a0
于是返回:0xe4,0xbd,0xa0。
3.string和byte[]
string其实核心是char[],然而要把byte转化成string,必须经过编码。string.length()其实就是char数组的长度,如果使用不同的编码,很可能会错分,造成散字和乱码。
例如:
String encoding = “”;
byte [] b={(byte)'\u00c4',(byte)'\u00e3'};
String str=new String(b,encoding);
如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字这个问题在处理分页是经常发生 。
4.Reader,Writer / InputStream,OutputStream
Reader和Writer核心是char,InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。
例如:
文件test.txt只有一个"你"字,0xc4,0xe3
String encoding = "gb2312";
InputStreamReader reader = new InputStreamReader(new FileInputStream(
"text.txt"), encoding);
char c[] = new char[10];
int length = reader.read(c);
for (int i = 0; i < length; i++) {
System.out.println(c[i]);
}
结果是什么?你
如果encoding ="8859_1",结果是什么???两个字符,表示不认识。
反过来的例子自己做。
5.我们要对java的编译器有所了解:
javac ?encoding
我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding,则按照系统的默认encoding,gb平台上是gb2312,英文平台上是iso8859_1。
java的编译器实际上是调用sun.tools.javac.main的类,对文件进行编译,这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取java文件的,然后把用utf-8形式编译成class文件。
例子代码:
String str = "你";
FileWriter writer = new FileWriter("text.txt");
write.write(str);
writer.close();
如果用gb2312编译,你会找到e4 bd a0的字段 ;
如果用8859_1编译, 00c4 00e3的二进制:
0000,0000 ,1100,0100 ,0000,0000 ,1110,0011
因为每个字符都大于7位,因此用11位编码:
1100,0001,1000,0100,1100,0011,1010,0011
c1-- 84-- c3-- a3
你会找到c1 84 c3 a3 。
但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:
样例代码在中文平台上编译,生成zhclass
样例代码在英文平台上编译,输出enclass
(1). zhclass在中文平台上执行ok,但是在英文平台上不行
(2). enclass在英文平台上执行ok,但是在中文平台上不行
原因:
(1). 在中文平台上编译后,其实str在运行态的char[]是0x4f60, 在中文平台上运行,filewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件。
但是如果是在英文平台下,chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?"
(2). 在英文平台上编译后,其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行,中文无法识别,因此会出现??;
在英文平台上,0x00c4-->0xc4,0x00e3->0xe3,因此0xc4,0xe3被放进了文件。
6. 其它原因:<%@ page contentType="text/html; charset=GBK" %>
设置浏览器的显示编码,如果response的数据是utf8编码,显示将是乱码,但是乱码和上述原因还不一样。
7. 发生编码的地方:
从数据库到java程序 byte――〉char
从java程序到数据库 char――〉byte
从文件到java程序 byte――〉char
从java程序到文件 char――〉byte
从java程序到页面显示 char――〉byte
从页面form提交数据到java程序byte――〉char
从流到java程序byte――〉char
从java程序到流char――〉byte
谢志钢的解决方法:
我是使用配置过滤器的方法解决中文乱码的:
<web-app>
<filter>
<filter-name>RequestFilter</filter-name>
<filter-class>net.golden.uirs.util.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 设置字符集?
实际上是设置了byte ――〉char的encoding
try {
if (userId == null || userId.equals("")) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {
session.invalidate();
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.jsp");
}
}
else { // 看看是否具有信息上报系统的权限
if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统",
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logonController.jsp");
}
}
}
}
catch (Exception ex) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.jsp");
}
fChain.doFilter(req, res);
}
发表评论
-
java多线程编程
2010-07-05 11:04 11731、 认识Thread和Runnable J ... -
将汉语转换成拼音(全拼和缩写)
2010-06-29 14:00 1916程序里面用到了开源的包,可以将汉语转成全拼或者缩写,代码如下: ... -
java正则表达式
2010-06-29 13:52 1657一、开篇说说 ^ 和 $ 想必很多人都对正则表达式都头 ... -
将省市数据批量导入数据库
2010-06-25 11:57 2178当要用到省市数据的时候,第一反应是这么多,难道要一条一条录入吗 ... -
java删除文件
2010-05-27 13:37 0/** * * * 2007- ... -
出现Bad version number in .class file这个问题时,要注意三个方面
2010-03-24 14:07 1180java.lang.UnsupportedClassVersi ... -
Java经典算法
2010-03-17 14:29 2661/** *插入排序(WHILE ... -
MyEclipse7.5注册机源码
2010-01-27 16:37 1634MyEclipse7.5注册机源码大家可以通过运行的方法得到自 ... -
测试服务器响应时间
2010-01-14 11:15 4931所谓的响应时间,就是从客户端开始发出请求到服务器最后返回请求时 ... -
能用map的时候尽量不用List
2009-12-17 11:05 1256今天在做项目的时候,用到了map,以前很少用的,一直在用Lis ... -
关于数组和List之间相互转换的方法
2009-10-10 09:58 11301.List转换成为数组(这里的List是实体是ArrayLi ... -
过滤代码中的html标签
2009-09-07 14:20 875public String html2Text(String ... -
java中空串""与null的区别
2009-06-26 13:16 1353问题:很容易对java中的""(空 ... -
在DispatchAction中使用中文按钮
2009-05-10 11:31 1238有两个方面要注意: 一、在资源文件里要有key value的 ... -
在JAVA中日期和字符串之间的相互转换
2009-02-21 09:07 1735在JAVA中日期和字符串之间是可以相互转换的,主要用到了Sim ... -
用JAVA程序调用DOS命令
2009-02-20 21:36 1711网上的代码是有问题,我做了一些修改,具体详细代码如下: pac ... -
equals 和 == 的区别
2008-12-31 12:28 1294equals 方法(是String类从它的超类Object中 ... -
输出某种编码的字符串
2008-10-15 09:22 1399Public String translate (String ...
相关推荐
MySQL数据库系统中文乱码问题及解决方案 MySQL数据库系统中文乱码问题是指在使用MySQL数据库系统时,中文字符在...本文详细介绍了MySQL数据库系统中文乱码问题的成因和解决方案,为开发者提供了有价值的参考和指导。
在IT行业中,Ajax(Asynchronous JavaScript ...通过理解和应用这些解决方案,开发者可以有效地避免和解决Ajax请求中的中文乱码问题,从而提高用户体验。记住,良好的编码习惯和对字符编码的理解是解决此类问题的关键。
Eclipse 中中文汉字乱码的解决方案 Eclipse 是一个功能强大且广泛使用的集成开发环境(IDE),但是在使用过程中,用户可能会遇到中文汉字乱码的问题。本文将为大家分享解决 Eclipse 中中文汉字乱码的方案,以便大家...
同时,本文档还提供了一些其他的解决方案和建议,旨在帮助 Linux 用户更好地解决中文乱码问题。 knowledge points: * Linux 系统中文乱码问题是由于 Linux 和 Windows 系统下所用户的字符集不同所导致的。 * 解决...
### Java中文乱码解决方案与经验 #### 一、字节与Unicode 在Java中处理文本时,经常会遇到中文乱码的问题。这是因为Java内部使用的是Unicode编码标准,而外部数据源如文件、网络传输等通常使用的是字节流,且可能...
mathtype中文乱码问题的解决
本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1...
解决方案_EXCEL打开Tableau导出数据存在中文乱码情况的解决方案...解决方案_EXCEL打开Tableau导出数据存在中文乱码情况的解决方案可以帮助我们避免中文乱码的问题,确保从Tableau中导出的数据可以正确地显示在EXCEL中。
然而,中文乱码问题一直是困扰开发者的一个常见问题,特别是在处理POST和GET请求时。以下是对标题和描述中涉及知识点的详细解释: 1. **StrutsPrepareAndExecuteFilter**: Struts2框架中的`...
本篇文章将深入探讨中文乱码问题的成因、解决方案,并介绍如何通过过滤器来有效预防和解决这类问题。 首先,我们需要了解字符编码的基本概念。字符编码是将字符与数字之间建立对应关系的过程,常用的中文编码有GBK...
在Java和C#之间进行Socket通信时,遇到中文乱码问题主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C#在处理字符串时可能使用其他编码,如GBK或ASCII。为了解决这个问题,我们需要确保两端在发送和接收...
sqlite数据库存取中文乱码的全部解决方案(包括其它数据库oracle+sqlserver+mysql) 数据库的连接方式、数据库里存放数据的字体编码、所选编程语言的缺省字体编码。如果在编程中遇到不能正确显示中文时、、、、
Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...
本文将深入探讨JSP中文乱码的成因以及提供多种解决方案,帮助开发者有效地处理这类问题。 ### 1. 乱码的可能原因 1. **编码设置不一致**:JSP页面、HTTP请求、响应、数据库等环节的字符编码设置不统一,导致字符在...
英文版Ubuntu Firefox中文乱码解决方案 在英文版Ubuntu系统中,Firefox浏览器中文乱码问题是一个常见的问题。该问题可能是由于系统字体配置不当或扫瞄器设置不正确引起的。在本文中,我们将介绍解决该问题的步骤和...
### PLSQL中文乱码问题解决方案 #### 背景与问题描述 在处理数据库操作时,经常遇到的一个问题是中文字符的显示出现乱码的情况。这种情况不仅会影响数据的正确读取,还会导致用户界面的不友好体验。对于使用PL/SQL...
总的来说,Dreamweaver的乱码问题可以通过修改注册表中与字符编码和字体设置相关的键值来解决。在进行这些操作时,务必谨慎,因为错误的修改可能导致软件功能异常或数据丢失。在进行任何系统级别的修改之前,始终...
### 51单片机串口发送汉字乱码问题解决方案 #### 一、问题背景与现象 在使用51单片机进行串口通信时,可能会遇到一个常见问题:通过串口发送汉字时,接收端接收到的是乱码而不是正常的汉字。这不仅影响了数据传输...
本篇文章将深入探讨中文乱码的原因、解决方案以及如何在JSP等Web开发环境中正确处理中文编码,以期为遇到类似问题的开发者提供实用的指导。 ### 中文乱码的常见原因 中文乱码问题通常源于字符集不匹配或编码转换...