Index: resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/encoding/EncodingTest.java
===================================================================
--- resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/encoding/EncodingTest.java	(revision 1302)
+++ resteasy-jaxrs/src/test/java/org/jboss/resteasy/test/encoding/EncodingTest.java	(working copy)
@@ -1,5 +1,13 @@
 package org.jboss.resteasy.test.encoding;
 
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.nio.charset.CharacterCodingException;
+
 import org.jboss.resteasy.client.ClientResponse;
 import org.jboss.resteasy.client.ProxyFactory;
 import org.jboss.resteasy.plugins.server.tjws.TJWSEmbeddedJaxrsServer;
@@ -10,14 +18,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.nio.charset.CharacterCodingException;
-
 public class EncodingTest
 {
    private static TJWSEmbeddedJaxrsServer tjws;
@@ -124,6 +124,13 @@
       }
 
    }
+   
+   @Test
+   public void decodeChineseInPath() throws Exception
+   {
+      String path = Encode.decodePath("/%E5%B9%B4%E5%81%87%E6%9C%9F/%E5%B9%B4%E5%81%87%E6%9C%9F");
+      Assert.assertEquals("/\u5e74\u5047\u671f/\u5e74\u5047\u671f", path);
+   }
 
    public void viaDirectURI(Character toTest) throws Exception
    {
Index: resteasy-jaxrs/src/main/java/org/jboss/resteasy/util/Encode.java
===================================================================
--- resteasy-jaxrs/src/main/java/org/jboss/resteasy/util/Encode.java	(revision 1302)
+++ resteasy-jaxrs/src/main/java/org/jboss/resteasy/util/Encode.java	(working copy)
@@ -1,17 +1,22 @@
 package org.jboss.resteasy.util;
 
-import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
-
-import javax.ws.rs.core.MultivaluedMap;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
+import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
+
 /**
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
@@ -197,35 +202,42 @@
    //private static final Pattern nonCodes = Pattern.compile("%([^a-fA-F0-9]|$)");
    private static final Pattern nonCodes = Pattern.compile("%([^a-fA-F0-9]|[a-fA-F0-9]$|$|[a-fA-F0-9][^a-fA-F0-9])");
    private static final Pattern encodedChars = Pattern.compile("%([a-fA-F0-9][a-fA-F0-9])");
+   private static final Pattern encodedCharsMulti = Pattern.compile("((%[a-fA-F0-9][a-fA-F0-9])+)");
 
    public static String decodePath(String path)
    {
-      Matcher matcher = encodedChars.matcher(path);
+      Matcher matcher = encodedCharsMulti.matcher(path);
       StringBuffer buf = new StringBuffer();
+      CharsetDecoder decoder = Charset.forName(UTF_8).newDecoder();
       while (matcher.find())
       {
-         String enc = matcher.group(1);
-         int c = Integer.parseInt(enc, 16);
-         StringBuffer cBuf = new StringBuffer();
-         char chr = (char) c;
-         // if we don't do this switch logic then it will screw up regex appendReplacement
-         switch (chr)
-         {
-            case '\\':
-               cBuf.append("\\\\");
-               break;
-            case '$':
-               cBuf.append("\\$");
-               break;
-            default:
-               cBuf.append(chr);
-
-         }
-         matcher.appendReplacement(buf, cBuf.toString());
+         decoder.reset();
+         String decoded = decodeBytes(matcher.group(1), decoder);
+         decoded = decoded.replace("\\", "\\\\");
+         decoded = decoded.replace("$", "\\$");
+         matcher.appendReplacement(buf, decoded);
       }
       matcher.appendTail(buf);
       return buf.toString();
    }
+   
+   private static String decodeBytes(String enc, CharsetDecoder decoder)
+   {
+      Matcher matcher = encodedChars.matcher(enc);
+      StringBuffer buf = new StringBuffer();
+      ByteBuffer bytes = ByteBuffer.allocate(enc.length() / 3);
+      while (matcher.find())
+      {
+         int b = Integer.parseInt(matcher.group(1), 16);
+         bytes.put((byte)b);
+      }
+      bytes.flip();
+      try {
+          return decoder.decode(bytes).toString();
+      } catch (CharacterCodingException e) {
+          throw new RuntimeException(e);
+      }
+   }
 
    /**
     * Encode '%' if it is not an encoding sequence
