我在Android应用程序中发了一个HTTP帖子。值从我的应用程序发送到我的网络服务器。问题是,这些值不是我想要的UTF-8。我的网络服务器有UTF-8编码,所以我知道我的应用程序中有代码需要更改。 请参阅下面的我的代码:
private void sendPostRequest(String facebookId, String name, String email) {
class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... bcs) {
String bcFacebookId = bcs[0];
String bcName = bcs[1];
String bcEmail = bcs[2];
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("URL");
BasicNameValuePair facebookIdBasicNameValuePair = new BasicNameValuePair("bcFacebookId", bcFacebookId);
BasicNameValuePair nameBasicNameValuePair = new BasicNameValuePair("bcName", bcName);
BasicNameValuePair emailBasicNameValiePair = new BasicNameValuePair("bcEmail", bcEmail);
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
nameValuePairList.add(facebookIdBasicNameValuePair);
nameValuePairList.add(nameBasicNameValuePair);
nameValuePairList.add(emailBasicNameValiePair);
try {
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);
httpPost.setEntity(urlEncodedFormEntity);
try {
HttpResponse httpResponse = httpClient.execute(httpPost);
InputStream inputStream = httpResponse.getEntity().getContent();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while((bufferedStrChunk = bufferedReader.readLine()) != null){
stringBuilder.append(bufferedStrChunk);
}
return stringBuilder.toString();
} catch (ClientProtocolException cpe) {
cpe.printStackTrace();
} catch (IOException ioe) {
System.out.println("Second Exception caz of HttpResponse :" + ioe);
ioe.printStackTrace();
}
} catch (UnsupportedEncodingException uee) {
System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
uee.printStackTrace();
}
return null;
}
例如,字母'ö'变为'?'。我该如何解决? 干杯!
答案 0 :(得分:7)
将字符转换为问号的最大原因是将字符转换为字节,然后再转换为字符,而不是匹配。
您提供的代码包含以下行:
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
这是有问题的,因为您没有指定如何将字节转换为字符。相反,你可能想要这个:
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
您为字符编码指定的内容取决于您在别处指定的字符编码。如果不指定字符编码,您将获得“默认”字符编码,这取决于客户端和服务器中的设置。 Java使用Unicode,而UTF-8是唯一能保留Java允许的所有字符的编码。
对于调试,您可能希望使用InputStream并从中检索字节,并打印出字节值,以验证它们确实是原始字符值的UTF-8编码表示。 'ö'(x00F6)的正确编码是'ö'(x00C3 x00B6)。
您还需要确保原始POST请求是正确的UTF-8编码。 UrlEncodedFormEntity类也使用默认字符编码,该编码可能不是UTF-8。改变这个:
UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(nameValuePairList);
到
UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(nameValuePairList, "UTF-8");
答案 1 :(得分:0)
如果正确设置数据库编码+正确设置表格编码+正确设置列编码,则正确存储所有数据。这是第一部分。现在是第二个重要部分 - 确保在mysql连接后有这个命令:SET NAMES utf8
这是我遇到同样问题的情况。希望这对你也有用。