j2me经验总结之URLEncoding


作者:hunhun1981
出自:http://blog.csdn.net/hunhun1981/

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

不过,J2ME除外。

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

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

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

先警告大家,有几个真机,不管输入什么样的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 );
 }

更多信息,请关注hunhun1981的专栏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值