开发者

Sending Non-latin query string in URL in JavaME

I want to make am HTTP GET request from my J2ME application using HttpConnection class. The problem is that I cannot send russian text in the query stri开发者_开发百科ng. Here is the example of how I'm sending the request

c = (HttpConnection)Connector.open("http://127.0.0.1:1418/zp.ashx?тест");
InputStream s = c.openInputStream();

The receiving asp.net script receives the query part of the url as %3f%3f%3f%3f

That is 4 identical codes. Definately that's not what I'm sending

So how can I send non-latin text in an http query in J2ME?

Thank you in advance


Your code

Connector.open("http://127.0.0.1:1418/zp.ashx?тест");

is processed by a java.nio.CharsetDecoder for the ASCII character set, and this decoder replaces all unknown characters with its replacement.

To get the behavior you want, you have to encode the URL before sending it. For example, when your server expects the URLs to be UTF8-encoded:

String encodedParameter = URLEncoder.encode("тест", "UTF-8");
Connector.open("http://127.0.0.1:1418/zp.ashx?" + encodedParameter);

Note that if you have multiple parameters, you have to encode both the parameter names and the parameter values individually, before putting them together with "=" and concatenating them with "&". If you need to encode multiple parameters, this class may be helpful to you:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UrlParamGenerator {
  private final String encoding;
  private final StringBuilder sb = new StringBuilder();
  private String separator = "?";

  public UrlParamGenerator(String charset) {
    this.encoding = charset;
  }

  public void add(String key, String value) throws UnsupportedEncodingException {
    sb.append(separator);
    sb.append(URLEncoder.encode(key, encoding));
    sb.append("=");
    sb.append(URLEncoder.encode(value, encoding));
    separator = "&";
  }

  @Override
  public String toString() {
    return sb.toString();
  }

  public static void main(String[] args) throws UnsupportedEncodingException {
    UrlParamGenerator gen = new UrlParamGenerator("UTF-8");
    gen.add("test", "\u0442\u0435\u0441\u0442");
    gen.add("x", "0");
    System.out.println(gen.toString());
  }
}


You might need to explicitly set a character set in the HTTP header that supports the cyrillic alphabet. You could either use UTF-8 or another charset, such as windows-1251 (although UTF-8 should be the preferred choice).

c.setRequestProperty("Content-type", "application/x-www-form-urlencoded;charset=utf-8");    
c = (HttpConnection)Connector.open("http://127.0.0.1:1418/zp.ashx?тест");

If you use an appropriate charset, the server should be able to properly handle the cyrillic request parameter - provided it too supports this charset.


URL can contain only ASCII chars and a few punctuation chars. For other chars, you must %-encode them before adding them in the URL. Use URLEncoder.encode("тест", enc) where the enc parameter is the encoding scheme that the server expects.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜