package edu.cmu.minorthird.util; /** * Encode/decode special characters in strings. * */ public class StringEncoder { private char escapeChar; private String illegalChars; public StringEncoder(char escapeChar,String illegalChars) { this.escapeChar = escapeChar; this.illegalChars = illegalChars; } public String encode(String s) { StringBuffer buf = new StringBuffer(""); for (int i=0; i<s.length(); i++) { char ch = s.charAt(i); if (ch==escapeChar) { buf.append(escapeChar); buf.append(escapeChar); } else if (isIllegal(ch)) { buf.append(escapeChar); int code = ch; int hex1 = code/16; int hex2 = code%16; buf.append(Character.forDigit(hex1,16)); buf.append(Character.forDigit(hex2,16)); } else { buf.append(ch); } } return buf.toString(); } public String decode(String s) { StringBuffer buf = new StringBuffer(""); int k=0; while (k<s.length()) { if (s.charAt(k)!=escapeChar) { buf.append(s.charAt(k)); k+=1; } else if (s.charAt(k+1)==escapeChar) { buf.append(escapeChar); k+=2; } else { int hex1 = Character.digit(s.charAt(k+1),16); int hex2 = Character.digit(s.charAt(k+2),16); // int code = hex1*16+hex2; buf.append((char)(hex1*16+hex2)); k+=3; } } return buf.toString(); } private boolean isIllegal(char c) { for (int i=0; i<illegalChars.length(); i++) { if (illegalChars.charAt(i)==c) return true; } return false; } static public void main(String[] args) { StringEncoder e = new StringEncoder('%',".= \t"); for (int i=0; i<args.length; i++) { System.out.println("'"+args[i]+"'\t'"+e.encode(args[i])+"'\t'"+e.decode(e.encode(args[i]))+"'"); } } }