作者: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 );
}
}
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的专栏 。