post乱码问题 http post 中文乱码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你字符串本身是否是UTF-8的? 看看是否是GBK的。 之前Eclipse的编码是GBK的后来改成utf-8依然不起作用 服务器端的编码就是utf-8 debug看下服务器端接收到的时候是什么状态,才看到,你post字符串是很难解决,不如post一个json就可以了, 我的json是类似下面这种格式{“weather”:[{"id":"330334",“name”:"aaa"},{"id":"330335",“name”:"bbb"}]不好用new BasicNameValuePair我是用gson转的字符串 然后在post.setEntity(new StringEntity(params,"UTF-8"));不知有更好的办法post json没 URL url = new URL("http://localhost:8080/PaymentService/card/add");HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setRequestMethod("POST");con.setRequestProperty("Content-Type", "application/json");con.setDoInput(true);con.setDoOutput(true);OutputStream os = con.getOutputStream();OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8");writer.write(str);writer.flush();writer.close();InputStream is = con.getInputStream();BufferedReader isr = new BufferedReader(new InputStreamReader(is));System.out.println(isr.readLine()); 问了服务器那边几次了 一直说是用utf-8读的说ios用utf-8提交中文没问题 像你这种情况,只能用最后一招了,在提交之前把字符串转化成国际化编码(unicode),服务器接口接收数据后再转回来,/** * 将字符串转化成国际化编码 * @param str 要操作的字符串 * @return String * */ public static String toUnicode(String str) { if (isBlank(str)) { return ""; } char[] array = str.toCharArray(); int value = 0; String result = ""; for (int i = 0; i < array.length; i++) { value = (int) str.charAt(i); if (value <= 256) { result += "\\u00" + Integer.toHexString(value); }else{ result += "\\u" + Integer.toHexString(value); } } return result; } /** * 把国际化编码转成中文(字符串) * @param str 要操作的国际化编码 * @return String */ public static String deUnicode(String str) { if (isBlank(str)) {return "";} char aChar; int len = str.length(); StringBuffer outBuffer = new StringBuffer(len); for (int x = 0; x < len;) { aChar = str.charAt(x++); if (aChar == '\\') { aChar = str.charAt(x++); if (aChar == 'u') { int value = 0; for (int i = 0; i < 4; i++) { aChar = str.charAt(x++); switch (aChar) { case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':value = (value << 4) + aChar - '0';break; case 'a':case 'b':case 'c':case 'd':case 'e': case 'f':value = (value << 4) + 10 + aChar - 'a';break; case 'A':case 'B':case 'C':case 'D':case 'E': case 'F':value = (value << 4) + 10 + aChar - 'A';break; default:throw new IllegalArgumentException("Malformed encoding."); } } outBuffer.append((char) value); } else { if (aChar == 't') { aChar = '\t'; } else if (aChar == 'r') { aChar = '\r'; } else if (aChar == 'n') { aChar = '\n'; } else if (aChar == 'f') { aChar = '\f'; } outBuffer.append(aChar); } } else { outBuffer.append(aChar); } } return outBuffer.toString(); } public static void main(String[] args) { String unicode = toUnicode("我就不信了,这样还是乱码"); System.out.println("这就是国际化编码:\t" + unicode); System.out.println("再转回来:\t" + deUnicode(unicode)); }运行这个main方法后,控制台输出:这就是国际化编码: \u6211\u5c31\u4e0d\u4fe1\u4e86\uff0c\u8fd9\u6837\u8fd8\u662f\u4e71\u7801再转回来: 我就不信了,这样还是乱码这样是绝对能解决乱码问题的,就是有点麻烦,你自己掂量吧 其实我想问下,你项目的编码是不是utf-8 TabActivity问题 webView焦点移出的问题!? listview刷新问题。急=。=求助 andorid模拟器启动的时候老报错误 大家帮忙看看 jni调用 只要不是脚本语言就都可以开发安卓,Iphone应用么? 如何将自定义文件打包apk文件中? ANR 超时log求指点一下,多谢! 请教各位如何读取/dev下面的设备文件 怎样快速搭建一个android mvp框架? HttpClient 报错求助 NTP服务器需要连网吗
后来改成utf-8依然不起作用
服务器端的编码就是utf-8
我的json是类似下面这种格式
{“weather”:[{"id":"330334",“name”:"aaa"},{"id":"330335",“name”:"bbb"}]
不好用new BasicNameValuePair
我是用gson转的字符串 然后在post.setEntity(new StringEntity(params,"UTF-8"));
不知有更好的办法post json没
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setDoInput(true);
con.setDoOutput(true);
OutputStream os = con.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8");
writer.write(str);
writer.flush();
writer.close();
InputStream is = con.getInputStream();
BufferedReader isr = new BufferedReader(new InputStreamReader(is));
System.out.println(isr.readLine());
说ios用utf-8提交中文没问题
在提交之前把字符串转化成国际化编码(unicode),服务器接口接收数据后再转回来,
/**
* 将字符串转化成国际化编码
* @param str 要操作的字符串
* @return String
* */
public static String toUnicode(String str) {
if (isBlank(str)) {
return "";
}
char[] array = str.toCharArray();
int value = 0;
String result = "";
for (int i = 0; i < array.length; i++) {
value = (int) str.charAt(i);
if (value <= 256) {
result += "\\u00" + Integer.toHexString(value);
}else{
result += "\\u" + Integer.toHexString(value);
}
}
return result;
}
/**
* 把国际化编码转成中文(字符串)
* @param str 要操作的国际化编码
* @return String
*/
public static String deUnicode(String str) {
if (isBlank(str)) {return "";}
char aChar;
int len = str.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;) {
aChar = str.charAt(x++);
if (aChar == '\\') {
aChar = str.charAt(x++);
if (aChar == 'u') {
int value = 0;
for (int i = 0; i < 4; i++) {
aChar = str.charAt(x++);
switch (aChar) {
case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':
case '9':value = (value << 4) + aChar - '0';break;
case 'a':case 'b':case 'c':case 'd':case 'e':
case 'f':value = (value << 4) + 10 + aChar - 'a';break;
case 'A':case 'B':case 'C':case 'D':case 'E':
case 'F':value = (value << 4) + 10 + aChar - 'A';break;
default:throw new IllegalArgumentException("Malformed encoding.");
}
}
outBuffer.append((char) value);
} else {
if (aChar == 't') {
aChar = '\t';
} else if (aChar == 'r') {
aChar = '\r';
} else if (aChar == 'n') {
aChar = '\n';
} else if (aChar == 'f') {
aChar = '\f';
}
outBuffer.append(aChar);
}
} else {
outBuffer.append(aChar);
}
}
return outBuffer.toString();
}
public static void main(String[] args) {
String unicode = toUnicode("我就不信了,这样还是乱码");
System.out.println("这就是国际化编码:\t" + unicode);
System.out.println("再转回来:\t" + deUnicode(unicode));
}
运行这个main方法后,控制台输出:这就是国际化编码: \u6211\u5c31\u4e0d\u4fe1\u4e86\uff0c\u8fd9\u6837\u8fd8\u662f\u4e71\u7801
再转回来: 我就不信了,这样还是乱码
这样是绝对能解决乱码问题的,就是有点麻烦,你自己掂量吧