将含有特殊字符的字符串转换成纯英文字母的字符串原始字符串可以是任何字符串,需要转换成只含有26个英文字母的字符串,要求转换过后要能转换回去我的思路是将原字符串转换成二进制串,然后将其转换成26进制
不知道思路是否可行,望高手指教

解决方案 »

  1.   

    像unicode的0x7ECF、0x0061也才用了17个符号表示
      

  2.   

    import java.util.*;public class Test{

        public static void main(String args[]) throws Exception {
         String str="!2Asf ,@#$ff";
         String result=toAString(str);
         System.out.println(result);
         String original=toString(result);
         System.out.println(original);
        }
        
        public static String toAString(String str){
         byte[] bytes=str.getBytes();
         StringBuilder sb=new StringBuilder();
         for(int i=0;i<bytes.length;i++){
         String temp=Integer.toString(bytes[i]&0xff,26);
         if(temp.length()==1){
         temp="0"+temp;
         }
         char[] chars=temp.toCharArray();
         for(int j=0;j<chars.length;j++){
         chars[j]=(char)('A'+Character.digit(chars[j],26));
         sb.append(chars[j]);
         }
         }
         return sb.toString();
        }
        public static String toString(String str){
         char[] chars=str.toCharArray();
         byte[] bytes=new byte[str.length()/2];
         for(int i=0;i<chars.length;i++){
         chars[i]=Character.forDigit((chars[i]-'A'),26);
         }
         for(int i=0;i<bytes.length;i++){
         bytes[i]=(byte)(Integer.parseInt(new String(new char[]{chars[2*i],chars[2*i+1]}),26));
         }
         return new String(bytes);
        }  
    }
    F:\java>java Test
    BHBYCNELDYBGBSCMBJBKDYDY
    !2Asf ,@#$ff
      

  3.   

    加上一些注释:import java.util.*;
    public class Test{

        public static void main(String args[]) throws Exception {
         String str="!2Asf ,@#$ff";
         System.out.println("原字符串是:"+str);
         String result=toAlphaString(str);
         System.out.println("转换结果为:"+result);
         String original=toString(result);
         System.out.println("由英文字符串转复原字符串:"+original);
        }
        
        //把一个字符串转,转为只含英文字符的字符串。
        //
        public static String toAlphaString(String str){
         byte[] bytes=str.getBytes();                            //得到字符串的字节数据
         StringBuilder sb=new StringBuilder();
         for(int i=0;i<bytes.length;i++){
         String temp=Integer.toString(bytes[i]&0xff,26);    //把每个字节都看做一个26进制的数,并把这个数转为字符串
         if(temp.length()==1){                              //齐两位
         temp="0"+temp;
         }
         char[] chars=temp.toCharArray();                     //把字符串转为字符数组
         for(int j=0;j<chars.length;j++){
         chars[j]=(char)('A'+Character.digit(chars[j],26)); //对第一个字符,都把它平移到26个大写的英文字母区域
         sb.append(chars[j]);
         }
         }
         return sb.toString();
        }
        
        //把一个只含英文字符的字符串还原为原字符串
        //算法是toAlplhaString的逆过程。
        //
        public static String toString(String str){
         char[] chars=str.toCharArray();
         byte[] bytes=new byte[str.length()/2];
         for(int i=0;i<chars.length;i++){
         chars[i]=Character.forDigit((chars[i]-'A'),26);
         }
         for(int i=0;i<bytes.length;i++){
         bytes[i]=(byte)(Integer.parseInt(new String(new char[]{chars[2*i],chars[2*i+1]}),26));
         }
         return new String(bytes);
        }  
    }
    结果为:
    F:\java>java Test
    原字符串是:!2Asf ,@#$ff
    转换结果为:BHBYCNELDYBGBSCMBJBKDYDY
    由英文字符串转复原字符串:!2Asf ,@#$ff