【问题标题】:Special characters with KSOAP带有 KSOAP 的特殊字符
【发布时间】:2011-04-12 17:38:16
【问题描述】:

我正在使用 KSOAP2 来调用 Web 服务。我收到了回复,但该回复中的特殊字符未正确显示。

我该如何改变呢?

编辑:

以下代码负责发送和接收数据:

package org.ksoap2.transport;

import java.util.List;
import java.io.*;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;

import org.ksoap2.*;
import org.xmlpull.v1.*;

/**
 * A J2SE based HttpTransport layer.
 */
public class HttpTransportSE extends Transport {

    private ServiceConnection connection;

    /**
     * Creates instance of HttpTransportSE with set url
     * 
     * @param url
     *            the destination to POST SOAP data
     */
    public HttpTransportSE(String url) {
        super(null, url);
    }

    /**
     * Creates instance of HttpTransportSE with set url and defines a
     * proxy server to use to access it
     * 
     * @param proxy
     *              Proxy information or <code>null</code> for direct access
     * @param url
     *              The destination to POST SOAP data
     */
    public HttpTransportSE(Proxy proxy, String url) {
        super(proxy, url);
    }

    /**
     * Creates instance of HttpTransportSE with set url
     * 
     * @param url
     *            the destination to POST SOAP data
     * @param timeout
     *            timeout for connection and Read Timeouts (milliseconds)
     */
    public HttpTransportSE(String url, int timeout) {
        super(url, timeout);
    }

    /**
     * set the desired soapAction header field
     * 
     * @param soapAction
     *            the desired soapAction
     * @param envelope
     *            the envelope containing the information for the soap call.
     * @throws IOException
     * @throws XmlPullParserException
     */
    public void call(String soapAction, SoapEnvelope envelope) throws IOException, XmlPullParserException {

        call(soapAction, envelope, null);
    }

    /**
     * 
     * set the desired soapAction header field
     * 
     * @param soapAction
     *              the desired soapAction
     * @param envelope
     *              the envelope containing the information for the soap call.
     * @param headers
     *              a list of HeaderProperties to be http header properties when establishing the connection
     *                         
     * @return <code>CookieJar</code> with any cookies sent by the server
     * @throws IOException
     * @throws XmlPullParserException
     */
    public List call(String soapAction, SoapEnvelope envelope, List headers) 
        throws IOException, XmlPullParserException {

        if (soapAction == null)
            soapAction = "\"\"";

        byte[] requestData = createRequestData(envelope);

        requestDump = debug ? new String(requestData) : null;
        responseDump = null;

        connection = getServiceConnection();

        connection.setRequestProperty("User-Agent", "kSOAP/2.0");
        connection.setRequestProperty("SOAPAction", soapAction);
        connection.setRequestProperty("Content-Type", "text/xml");
        connection.setRequestProperty("Connection", "close");
        connection.setRequestProperty("Content-Length", "" + requestData.length);

        // Pass the headers provided by the user along with the call
        if (headers != null) {
            for (int i = 0; i < headers.size(); i++) {
                HeaderProperty hp = (HeaderProperty) headers.get(i);
                connection.setRequestProperty(hp.getKey(), hp.getValue());
            }
        }

        connection.setRequestMethod("POST");
        connection.connect();


        OutputStream os = connection.openOutputStream();

        os.write(requestData, 0, requestData.length);
        os.flush();
        os.close();
        requestData = null;
        InputStream is;
        List retHeaders = null;

        try {
            connection.connect();
            is = connection.openInputStream();
            retHeaders = connection.getResponseProperties();
        } catch (IOException e) {
            is = connection.getErrorStream();

            if (is == null) {
                connection.disconnect();
                throw (e);
            }
        }

        if (debug) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[256];

            while (true) {
                int rd = is.read(buf, 0, 256);
                if (rd == -1)
                    break;
                bos.write(buf, 0, rd);
            }

            bos.flush();
            buf = bos.toByteArray();
            responseDump = new String(buf);
            is.close();
            is = new ByteArrayInputStream(buf);
        }

        parseResponse(envelope, is);
        return retHeaders;
    }

    public ServiceConnection getConnection() {
        return (ServiceConnectionSE) connection;
    }

    protected ServiceConnection getServiceConnection() throws IOException {
        return new ServiceConnectionSE(proxy, url);
    }

    public String getHost() {

        String retVal = null;

        try {
            retVal = new URL(url).getHost();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return retVal;
    }

    public int getPort() {

        int retVal = -1;

        try {
            retVal = new URL(url).getPort();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return retVal;
    }

    public String getPath() {

        String retVal = null;

        try {
            retVal = new URL(url).getPath();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        return retVal;
    }
}

我可以更改哪些行来强制执行 UTF-8 编码?

【问题讨论】:

  • 它们是德语变音符号(ä、ü、ö)
  • 你是如何尝试向他们展示的?在 TextView 中?
  • 你调试了吗?如果是这样,您的变量在调试器中显示什么值?我的意思是,是您的 SOAP 代码还是您的显示代码有问题?
  • 对应变量的值包含了特殊字符应该在的地方(使用调试器),所以我猜KSOAP的编码有问题
  • 嗯,它是被编码为虚拟的还是控制台字体不知道如何呈现该编码?

标签: android web-services ksoap2 diacritics


【解决方案1】:

我发现编码不是 UTF-8,而是 ISO_8859_1。我将 ISO_8859_1 编码的输入流转换为 UTF-8,现在一切都以应有的方式显示。

【讨论】:

    【解决方案2】:

    老问题,但如果我可以帮助任何人,我会发布我的解决方案。

    类似的问题。我搜索了服务器日志,发现我的请求是 ISO-8859-1 编码的,所以服务器响应也有这个字符集。我的解决方案是覆盖 ksoap API。在您提出问题的 HttpTransportSE 类中,在方法调用中,我更改了行:

    connection.setRequestProperty("Content-Type", "text/xml");
    

    我希望我的请求是 UTF-8 编码的,所以我添加了:

    connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
    

    现在,我发送一个 UTF-8 请求,并得到一个 UTF-8 响应。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      当我尝试将中文字符发送到 php 服务器并且服务器得到 ??? 时,我遇到了类似的问题, 我发现这是 ksoap 的一个错误,请阅读enter link description here 了解详细信息。 此错误已在 ksoap2.6 中修复。

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2012-10-06
        • 2018-11-14
        • 2012-09-15
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多