在JavaME中的URL中发送非拉丁语查询字符串

时间:2010-06-18 16:24:22

标签: java java-me

我想使用HttpConnection类从我的J2ME应用程序发出HTTP GET请求。 问题是我无法在查询字符串中发送俄语文本。 以下是我发送请求的示例

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

接收asp.net脚本接收url的查询部分为%3f%3f%3f%3f

这是4个相同的代码。肯定不是我发送的东西

那么如何在J2ME中的http查询中发送非拉丁文本?

提前谢谢

3 个答案:

答案 0 :(得分:1)

您可能需要在支持西里尔字母的HTTP标头中显式设置字符集。您可以使用UTF-8或其他字符集,例如windows-1251(尽管UTF-8应该是首选)。

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

如果您使用适当的字符集,服务器应该能够正确处理西里尔语请求参数 - 前提是它也支持此字符集。

答案 1 :(得分:1)

URL只能包含ASCII字符和一些标点字符。对于其他字符,您必须先对它们进行编码,然后才能在URL中添加它们。使用URLEncoder.encode("тест", enc),其中enc参数是服务器期望的编码方案

答案 2 :(得分:1)

您的代码

Connector.open("http://127.0.0.1:1418/zp.ashx?тест");
对于ASCII字符集,

java.nio.CharsetDecoder处理,此解码器用其replacement替换所有未知字符。

要获得所需的行为,您必须在发送之前对URL进行编码。例如,当您的服务器期望URL为UTF8编码时:

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

请注意,如果您有多个参数,则必须分别对参数名称和参数值进行编码,然后将它们与“=”放在一起,并将它们与“&”连接起来。如果您需要编码多个参数,这个类可能对您有所帮助:

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());
  }
}