java - 为什么在简单的Java项目中不能使用UTF-8编码,而在Android中却不能?

原文 标签 java android encoding utf-8

我在使用UTF-8字符编码时遇到了麻烦。我的android应用程序正在从mysql数据库通过服务器加载内容,未正确显示特殊字符,例如(é,í,ü,ö,ä等)。

我尝试了以下方法:


我查看了一下我的数据库,一切看起来都很好。 (utf8_unicode_ci)
我创建了一个简单的Java项目,使用自己的数据库框架直接在数据库上工作。一切看起来都不错!
我创建了一个简单的Java项目,使用相同的代码(AsyncTask除外)通过服务器从数据库请求数据。一切看起来都不错!
我看了看服务器日志文件,发送了响应
回到客户看起来不错!
我看了看传入的数据,字符串看起来坏了!!!之后进行转换通过`new String(line.getBytes(),“ utf-8”)´不起作用。


数字5对于普通的Java项目来说看起来不错,但是我的Android应用遇到了麻烦。
为此,我使用以下代码:

public class Sender extends AsyncTask<Object, String, Object> {

    private static final String LOG_CLASS = Sender.class.getSimpleName();

    private static final String host = "xxx";
    private static final String port = "8080";
    private static final String serverUrl = "http://" + host + ":" + port + "/WebService/HomeServlet";


    @Override
    protected Object doInBackground(Object ... request) {

        final HttpClient httpclient = new DefaultHttpClient();
        final HttpPost httppost = new HttpPost(serverUrl);

        final List<NameValuePair> params = new ArrayList<NameValuePair>(2);
        params.add(new BasicNameValuePair("SOAP", WsUtils.parseObjectToSoap(request[0])));

        try {
            httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream instream = entity.getContent();
                try {
                    Log.i(LOG_CLASS, "Calling Server: " + serverUrl);

                    InputStreamReader isr = new InputStreamReader(instream, "UTF-8");
                    BufferedReader reader = new BufferedReader(isr);

                    final StringBuilder soapMessage = new StringBuilder();

                    String line;
                    while ((line = reader.readLine()) != null) {
                        Log.i(LOG_CLASS, "xxxxxxxx: " + new String(line.getBytes(), "utf-8"));
                        soapMessage.append(line);
                    }

                    final String fullQualifiedClassName = WsUtils.identifySoapMessage(soapMessage.toString());
                    final Object parsedSoapCall = WsUtils.parseSoapToObject(fullQualifiedClassName, soapMessage.toString());

                    return parsedSoapCall;

                } finally {
                    instream.close();
                }
            }
        } catch (UnsupportedEncodingException e) {
            Log.e(LOG_CLASS, "Encoding is not supported: " + e.getStackTrace());
        } catch (ClientProtocolException e) {
            Log.e(LOG_CLASS, "ClientProtocolException: " + e.getStackTrace());
        } catch (IOException e) {
            Log.e(LOG_CLASS, "IOException: " + e.getStackTrace());
        }


        Log.e(LOG_CLASS, "Error while loading data from Server");
        return null;
    }

}


服务器的这一部分正在发送响应。日志消息显示没有编码问题。

public class HomeServlet extends HttpServlet {

    private static final long serialVersionUID = 7376640150158278177L;

    public static final Logger LOG = Logger.getLogger(HomeServlet.class);
    private Processing processing = new Processing();

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            final String soapMessage = req.getParameter("SOAP");

            /* do some work */

            /* Process request (Database processing etc.) */
            final String response = processing.process(parsedSoapCall);
            LOG.info("Incoming request processed, back to client: " + response);

            /* Sending response back to client */
            if (null != response) {
                final PrintWriter writer = resp.getWriter();
                writer.println(response);
            }

        }

    }


来自数据库类的连接字符串:

con = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true");


问题已解决:
此问题是由于Web服务器头中的编码丢失所致。
我已经将编码添加到标题中,现在可以正常工作了。 HttpServletResponse.setContentType(“ text / html”);
HttpServletResponse.setCharacterEncoding(“ UTF-8”);

谢谢你们。

最佳答案

代替使用InputStreamInputStreamReader逐行从实体中获取String,请尝试使用:

String responseBody = EntityUtils.toString(entity);


它将正确地自动检测HTTP响应中使用的以及标头中指定的编码。

关于java - 为什么在简单的Java项目中不能使用UTF-8编码,而在Android中却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27689691/

相关文章:

java - 具有多个可变查找属性的正确数据结构以进行收集

java - 多重选择listView包含复选框

java - Java中的URLDecoder在“圣保罗”上令人窒息

php - 如何使用 Shift-JIS 和 CP932 创建 SQL 注入(inject)攻击?

encoding - PUPPET UTF-8 中的无效字节序列

java - Spring Boot WebSocket-将主体添加到CONNECT响应

java - 类PriorityQueue <E>的方法添加是否可以返回false?

java - 没有插入数据并且在android sqlite中也没有抛出异常

java - 如何使叠加层接收触摸事件而不消耗其他应用程序的触摸?

java - Appium : how to check device name using automation test cases in java