URLEncoding

14 篇文章 0 订阅
14 篇文章 0 订阅
URLEncoding是用于解决链接字符串中包含中文字符的一种转换编码。各种编程环境下几乎带有它的库函数。

不过,J2ME除外。

好在JAVA的源代码中带有这个类,我们把它拷贝到J2ME环境下编译到我们的应用当中就可以了。

该文件位于JDK的目录下src.zip文件中,名叫URLEncoder.java。

但是,这个文件还需要做很多修改才能使用在J2ME环境中。

先警告大家,有几个真机(其中一个就是索爱的,好像是k500c),不管输入什么样的Encodeing都会出错,甚至是“UTF-8”。所以我一怒之下 去除了Encodeing参数。(这可是在实际应用中得出的结论,不去掉的话可以在大部分情况下正常使用,但是,现实总是有点缺陷)

修改后的代码如下,大家请放心使用。如果有兴趣,可以比较两个代码,看看我改动了什么地方。


import  java.io.ByteArrayOutputStream;
import  java.io.DataOutputStream;
public   class  HURLEncoder {
 
 
private   static   boolean [] dontNeedEncoding;
 
 
static  {
  dontNeedEncoding 
=   new   boolean [ 256 ];
 
  
for  ( int  i  =   0 ; i  <   256 ; i ++ ) {
   
boolean  b  =  ((i  >=  ‘ 0 ′)  &&  (i  <=  ‘ 9 ′))
     
||  ((i  >=  ‘A’)  &&  (i  <=  ‘Z’))  ||  ((i  >=  ‘a’)  &&  (i  <=  ‘z’));
 
   dontNeedEncoding[i] 
=  b;
  }
 
  dontNeedEncoding[’ ‘] 
=   true ;
  dontNeedEncoding[’
- ' ] = true;
  dontNeedEncoding[’_ ' ] = true;
  dontNeedEncoding[’. ' ] = true;
  dontNeedEncoding[’ * ' ] = true;
 }
 
 
public   static  String encode(String s) {
 
  
boolean  wroteUnencodedChar  =   false ;
 
  StringBuffer writer 
=   new  StringBuffer();
 
  StringBuffer out 
=   new  StringBuffer(s.length());
 
  
for  ( int  i  =   0 ; i  <  s.length(); i ++ ) {
   
char  c  =  s.charAt(i);
 
   
if  ((c  <   256 &&  dontNeedEncoding[c]) {
    
if  (c  ==  ‘ ‘) {
     c 
=  ‘ + ’;
    }
 
    out.append((
char ) c);
    wroteUnencodedChar 
=   true ;
   } 
else  {
    
try  {
     
if  (wroteUnencodedChar) {
      writer 
=   new  StringBuffer();
      wroteUnencodedChar 
=   false ;
     }
 
     writer.append(c);
 
     
if  (c  >=   0xD800   &&  c  <=   0xDBFF ) {
      
if  ((i  +   1 <  s.length()) {
       
int  d  =  ( int ) (s.charAt(i  +   1 ));
 
       
if  (d  >=   0xDC00   &&  d  <=   0xDFFF ) {
        writer.append(d);
        i
++ ;
       }
      }
     }
 
    } 
catch  (Exception e) {
     writer 
=   new  StringBuffer();
     
continue ;
    }
 
    String str 
=  writer.toString();
 
    ByteArrayOutputStream baos 
=   new  ByteArrayOutputStream();
    DataOutputStream dos 
=   new  DataOutputStream(baos);
    
try  {
     dos.writeUTF(str);
     dos.flush();
    } 
catch  (Exception e) {
     e.printStackTrace();
    }
 
    
byte [] temp  =  baos.toByteArray();
    
byte [] ba  =   new   byte [temp.length  -   2 ];
    
for  ( int  ix  =   0 ; ix  <  ba.length; ix ++ ) {
     ba[ix] 
=  temp[ix  +   2 ];
    }
 
    
for  ( int  j  =   0 ; j  <  ba.length; j ++ ) {
     out.append(’
% ' );
 
     
char  ch  =  forDigit((ba[j]  >>   4 &   0xF 16 );
     out.append(ch);
 
     ch 
=  forDigit(ba[j]  &   0xF 16 );
     out.append(ch);
    }
 
    writer 
=   new  StringBuffer();
    
try  {
     dos.close();
     baos.close();
    } 
catch  (Exception e) {
     e.printStackTrace();
    }
   }
  }
 
  
return  out.toString();
 }
 
 
private   static   char  forDigit( int  digit,  int  radix) {
  
if  ((digit  >=  radix)  ||  (digit  <   0 )) {
   
return  ‘ 0 ′;
  }
  
if  (digit  <   10 ) {
   
return  ( char ) (’ 0 ′  +  digit);
  }
  
return  ( char ) (’A’  +  digit  -   10 );
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值