Hello! Preposition: I have to work with non 8859-1 locales under servlets. (Tomcat 3.2 / MS Windows 2000). Problem: When I post form using GET or POST I got the ???? instead of cyrillic charasters in posted values when I'm using request.getParameter(name). Investigation: Tomcat uses servlet api implementation and javax.servlet.http.HttpUtils class for parsing posted data. The chars disappears in the method parseName(String, StringBuffer). Proposal: Change code of parseName() method implementation in the HttpUtils class to static private String parseName(String s, StringBuffer sb) { return java.net.URLDecoder().decode(s) } or (if we need StringBuffer functionality further). static private String parseName(String s, StringBuffer sb) { sb.setLength(0); sb.append(java.net.URLDecoder().decode(s)); return sb.toString(); } Because the java.net.URLDecoder makes the same logical thing and chars are don't dissappear ( :) ). The code of URLDecoder very similar to current implementation of parseName method, but have next additional part after decoding %NN's. ================== // Undo conversion to external encoding String result = sb.toString(); try { byte[] inputBytes = result.getBytes("8859_1"); result = new String(inputBytes); } catch (UnsupportedEncodingException e) { // The system should always have 8859_1 } ================== wbr, iit. ================================ old code state for the HttpUtils ================================= static private String parseName(String s, StringBuffer sb) { sb.setLength(0); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '+': sb.append(' '); break; case '%': try { sb.append((char) Integer.parseInt(s.substring(i+1, i+3), 16)); i += 2; } catch (NumberFormatException e) { // XXX // need to be more specific about illegal arg throw new IllegalArgumentException(); } catch (StringIndexOutOfBoundsException e) { String rest = s.substring(i); sb.append(rest); if (rest.length()==2) i++; } break; default: sb.append(c); break; } } return sb.toString(); } ======================================the URLDecoder.decode() source ============================ public static String decode(String s) { StringBuffer sb = new StringBuffer(); for(int i=0; i<s.length(); i++) { char c = s.charAt(i); switch (c) { case '+': sb.append(' '); break; case '%': try { sb.append((char)Integer.parseInt( s.substring(i+1,i+3),16)); } catch (NumberFormatException e) { throw new IllegalArgumentException(); } i += 2; break; default: sb.append(c); break; } } // Undo conversion to external encoding String result = sb.toString(); try { byte[] inputBytes = result.getBytes("8859_1"); result = new String(inputBytes); } catch (UnsupportedEncodingException e) { // The system should always have 8859_1 } return result; }