在我的Android应用程序中,我实现了asynctask
来检查服务器响应。它在语言问题之前工作正常。我将用户google email id
和user 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)
请建议我解决此问题的可能方法。
答案 0 :(得分:-1)
您应该使用URLEncoder
代替URLDecoder
。访问网络资源时,您的URL
应已编码,而非已解码。
所有其他字符都不安全,首先转换为一个或 使用某种编码方案的更多字节。然后表示每个字节 由3个字符的字符串“%xy”,其中xy是两位十六进制 字节的表示。推荐使用的编码方案是 UTF-8。但是,出于兼容性原因,如果不进行编码 指定,然后使用平台的默认编码。
https://developer.android.com/reference/java/net/URLEncoder.html