java中关于字符、文件乱码的笔记

 

老生常谈的问题了,记录一下以便他人翻阅。

 

结论:

1.       字符串与byte数组的转换 默认编码是采用系统的编码(例如Windows下是GB18030

2.       java类文件中本身包含的字符串,采用什么编码是 根据javac编译时的环境变量决定的。

 

穿插一下:

 

重复一下http中的中文乱码问题,例如使用prototype.js发送包含中文的ajax报文时,Servlet接收端可能会遇到乱码问题。该情况可以用以下api解决:

ServletRequest.setCharacterEncoding

ServletResponse.setCharacterEncoding

 

程序代码:

 

Java代码   收藏代码
  1. /** 
  2.  *  
  3.  * @author csbison 
  4.  */  
  5. public class BTest {  
  6.   
  7.     private final static char[] hexDigits = { '0''1''2''3''4''5',  
  8.             '6''7''8''9''a''b''c''d''e''f' };  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         // 测试证明, 字符串与byte数组的转换,默认就是用系统平台的  
  15.         try {  
  16.             String src = "诺基亚";  
  17.             String value = null;  
  18.             value = bytesToHexString(src.getBytes());  
  19.             System.out.println("Default=" + value);  
  20.   
  21.             value = bytesToHexString(src.getBytes("ISO-8859-1"));  
  22.             System.out.println("ISO-8859-1=" + value);  
  23.   
  24.             value = bytesToHexString(src.getBytes("GBK"));  
  25.             System.out.println("GBK=" + value);  
  26.   
  27.             value = bytesToHexString(src.getBytes("UTF-8"));  
  28.             System.out.println("UTF-8=" + value);  
  29.   
  30.             System.out.println("/");  
  31.   
  32.             byte[] aa = "诺基亚".getBytes();  
  33.             System.out.println(new String(aa));  
  34.             System.out.println(new String(aa, "GBK"));  
  35.             System.out.println(new String(aa, "ISO-8859-1"));  
  36.             System.out.println(new String(aa, "UTF-8"));  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.   
  41.     }  
  42.   
  43.     public static final String bytesToHexString(byte[] buf) {  
  44.         StringBuffer sb = new StringBuffer();  
  45.         for (int i = 0; i < buf.length; i++) {  
  46.             int n = buf[i];  
  47.             if (n < 0) {  
  48.                 n = 256 + n;  
  49.             }  
  50.             int d1 = n / 16;  
  51.             int d2 = n % 16;  
  52.   
  53.             sb.append(hexDigits[d1]);  
  54.             sb.append(hexDigits[d2]);  
  55.         }  
  56.         return sb.toString();  
  57.     }  
  58.   
  59. }  
 

 

Windows上的测试结果:

Default=c5b5bbf9d1c7

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/

诺基亚

诺基亚

?¦Ì?¨´??

ŵ��

 

Linux上的测试结果:

1.       Locale=zh的情况下,javac,然后再java执行。结果如下:

-bash-3.00$ java BTest

Default=c5b5bbf9d1c7

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/

诺基亚

诺基亚

???ù??

???

2.       Locale=C的情况下,直接java执行(也就是java文件还是在Locale=zh的环境下编译的)。结果如下:

-bash-3.00$ java BTest  

Default=3f3f3f

ISO-8859-1=3f3f3f

GBK=c5b5bbf9d1c7

UTF-8=e8afbae59fbae4ba9a

/

???

???

???

???

 

3.       Locale=C的情况下,javac,然后再java执行。结果如下:

-bash-3.00$ java BTest      

Default=c5b5bbf9d1c7

ISO-8859-1=c5b5bbf9d1c7

GBK=3f3f3fa8b43f3f

UTF-8=c385c2b5c2bbc3b9c391c387

/

诺基亚

???

诺基亚

???

 

 

关于对字符编码的问题,可以参考:

http://www.utf.com.cn/article/s320                    UTF-8 字符集基础(1

http://www.phpweblog.net/XBOX/archive/2008/09/06/5726.html

http://javajiao.iteye.com/blog/151995  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值