Android语言解析困难

时间:2016-09-26 09:56:40

标签: android

在我的Android应用程序中,我实现了asynctask来检查服务器响应。它在语言问题之前工作正常。我将用户google email iduser name发送到服务器以进行身份​​验证。

但是当用户名不是English时,服务器会发送错误。

这是我的代码。 。

HttpAsyncTaskCheckAuth checkAuth = new HttpAsyncTaskCheckAuth(SignUpActivity.this);
                checkAuth.execute("http://www.server_address.com//auth/login?email=" +
                        email +
                        "&name=" + name +
                        "&logged_in=" + "true");

如果输入名称English,这样可以正常工作。当用户输入非英语名称时,服务器无法成功执行。

以下是我在LogCat中收到的错误消息

09-26 16:09:34.567 3838-3838/package_name W/System.err: org.json.JSONException: Value Traceback of type java.lang.String cannot be converted to JSONArray
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:96)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:108)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at package_name.asyncTask.HttpAsyncTaskCheckAuth.onPostExecute(HttpAsyncTaskCheckAuth.java:53)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at package_name.asyncTask.HttpAsyncTaskCheckAuth.onPostExecute(HttpAsyncTaskCheckAuth.java:18)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.os.AsyncTask.finish(AsyncTask.java:636)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.os.AsyncTask.access$500(AsyncTask.java:177)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.os.Looper.loop(Looper.java:145)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6856)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
09-26 16:09:34.567 3838-3838/package_name W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

如何在成功执行的转换中转换名称?

我尝试了以下方法,但那些对我不起作用

URLDecoder.decode(name, "UTF-8").replaceAll(" ","%20") 

URLEncoder.encode(name, "UTF-8").replaceAll(" ","%20")

当我在Postman Chrome浏览器中选中相同的网址时,出现以下错误

    Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1401, in _stack_context_handle_exception
    raise_exc_info((type, value, traceback))
  File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 314, in wrapped
    ret = fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1613, in future_complete
    f.result()
  File "/usr/local/lib/python2.7/dist-packages/tornado/concurrent.py", line 232, in result
    raise_exc_info(self._exc_info)
  File "/usr/local/lib/python2.7/dist-packages/tornado/gen.py", line 282, in wrapper
    yielded = next(result)
  File "startup.py", line 15884, in get
    print user["name"]
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

请建议我解决此问题的可能方法。

1 个答案:

答案 0 :(得分:-1)

您应该使用URLEncoder代替URLDecoder。访问网络资源时,您的URL已编码,而非已解码

  

所有其他字符都不安全,首先转换为一个或   使用某种编码方案的更多字节。然后表示每个字节   由3个字符的字符串“%xy”,其中xy是两位十六进制   字节的表示。推荐使用的编码方案是   UTF-8。但是,出于兼容性原因,如果不进行编码   指定,然后使用平台的默认编码。

https://developer.android.com/reference/java/net/URLEncoder.html