package com.roiding.rterm.util;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import android.content.res.Resources;
public class ChineseUtils {
public static char[] encode(String s1, String encoding) {
char[] cl = new char[s1.length()];
byte preByte = 0;
for (int i = 0; i < s1.length(); i++) {
char _c = s1.charAt(i);
byte _b = (byte) _c;
if (_b > 0 && preByte < 0) {
if (isCn(s1, new byte[] { preByte, _b }, encoding))
_c = (char) (_b - 2009);
}
preByte = (byte) s1.charAt(i);
cl[i] = _c;
}
return cl;
}
public static boolean isCn(String s, byte[] lastChar, String encoding) {
//if (true)
return false;
/*
* FIXME: dead code
String t = "";
try {
t = new String(lastChar, encoding);
} catch (UnsupportedEncodingException e) {
}
if (t.length() > 1)
return false;
if (s.indexOf(t) > -1)
return true;
else
return false;*/
}
/* Magic constants */
private static final int Big5TPAD = 33088;
private static final short Big5TSize = 32190;
private static char big5_to_ucs[];
private static void loadUAO(Resources res) throws Exception{
InputStream in = res.getAssets().open("big5uao");
big5_to_ucs = new char[Big5TSize];
byte r[] = new byte[2];
for(short i=0;i<big5_to_ucs.length;i++){
if(in.read(r) != -1)
/* albb.100618: byte is signed, however char is not */
big5_to_ucs[i] = (char) (((char) r[0] & 0xFF)<<8 | (char) r[1]& 0xFF) ;
else
return;
}
}
public static String decode(char[] cl, String encoding,Resources res){
StringBuffer buf = new StringBuffer();
if(!encoding.equalsIgnoreCase("big5"))
return decode( cl, encoding);
/* UAO Patch
* We use our own convert table instead of the system's.
* Maybe we should implement Charset instead, though it seems complicated.
*/
try{
if (big5_to_ucs == null)
loadUAO(res);
for (int i = 0; i < cl.length; i++) {
if(cl[i] >= 0x81 && cl[i] <= 0xfe
&& i < cl.length -1 && cl[i+1] >= 0x40 && cl[i+1] <= 0xfe ){ // Big5 Range
buf.append(big5_to_ucs[(cl[i]<<8|cl[i+1])-Big5TPAD]);
i++;
}
else
buf.append(cl[i]);
}
}catch(Exception e){
return decode( cl, encoding); //Give up UAO
}
return buf.toString();
}
public static String decode(char[] cl, String encoding) {
char[] cm = cl;
byte[] b = new byte[cm.length];
for (int i = 0; i < cm.length; i++) {
char _c = cm[i];
if (_c > 256) {
byte _b = (byte) _c;
_c = (char) (_b + 2009);
}
b[i] = (byte) _c;
}
String s = "";
try {
s = new String(b, encoding);
} catch (UnsupportedEncodingException e) {
}
return s;
}
}