我想使用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查询中发送非拉丁文本?
提前谢谢
答案 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());
}
}