Look into it ~

present
随笔 - 32, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

URLEncoding

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& 0xF16);
     out.append(ch);
 
     ch 
= forDigit(ba[j] & 0xF16);
     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);
 }


posted on 2008-08-15 14:49 LukeW 阅读(1497) 评论(0)  编辑  收藏 所属分类: Tips, Tricks, Hints & Code


只有注册用户登录后才能发表评论。


网站导航: