在codenameone中获得服务响应中的问号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在codenameone中获得服务响应中的问号相关的知识,希望对你有一定的参考价值。

我正在使用ConnectionRequest类调用服务,如果我得到英语结果我能够显示它,但如果我在那时得到印地语的回复得到问号(?)而不是印地文文本。我正在使用梵文字体来显示印地文文本。这有什么解决方案吗?

这是我们如何请求的代码?

使用Map添加参数,如下所示。

Map<String, Object> map = new HashMap<String, Object>();
map.add("Key","Value");
map.add("Key1","Value1");
etc..

然后将此map对象传递给requestService方法。

    private static Map<String, Object> requestService(Map<String, Object> data) {

    Connection connection = null;
    Dialog progress = new InfiniteProgress().showInifiniteBlocking();
    try {
        connection = new Connection(data);
        NetworkManager networkManager = NetworkManager.getInstance();
        networkManager.addToQueueAndWait(connection);
        networkManager.setTimeout(600000);
        if(connection.getResponseData() == null) {
            return null;
        }
    } finally {
        progress.dispose();
    }

    JSONParser jp = new JSONParser();
    try {
        Map<String, Object> result = jp.parseJSON(new InputStreamReader(new ByteArrayInputStream(connection.getResponseData()), "UTF-8"));

        return result;
    } catch (Throwable e) {
        e.printStackTrace();
    }

    return null;
}

连接类:

private static class Connection extends ConnectionRequest {

    private final static char escapeS[] = new char[] { '"', '\', '/', '', 'f', '
', '
', '	' };
    private final static char escapeR[] = new char[] { '"', '\', '/', 'b', 'f', 'n', 'r', 't' };
    private Map<String, Object> data;

    private Connection(Map<String, Object> data) {
        this.data = data;
        setFailSilently(true);
        setPost(true);
        setWriteRequest(true);
        setContentType("application/json");

        setUrl(serverUrl);
    }

    @Override
    protected void buildRequestBody(OutputStream os) throws IOException {

        String v = buildJSON(data);

        if(shouldWriteUTFAsGetBytes()) {
            os.write(v.getBytes("UTF-8"));
        } else {
            OutputStreamWriter w = new OutputStreamWriter(os, "UTF-8");
            w.write(v);
        }
    }

    private static String buildJSON(Map<String, Object> data) {
        StringBuilder json = new StringBuilder();

        buildJSON(data, json);
        return json.toString();
    }

    @SuppressWarnings("unchecked")
    private static void buildJSON(Map<String, Object> data, StringBuilder json) {
        json.append('{');
        boolean first = true;
        Object value;
        for(String key: data.keySet()) {
            value = data.get(key);
            if(value == null) {
                continue;
            }
            if(first) {
                first = false;
            } else {
                json.append(",");
            }
            json.append('"').append(key).append("":");
            if(value instanceof Map) {
                buildJSON((Map<String, Object>) value, json);
            } else if(value instanceof Collection) {
                buildJSON((Collection<Map<String, Object>>)value, json);
            } else {
                if(value instanceof Long || value instanceof Integer || value instanceof Double
                        || value instanceof Short || value instanceof Float) {
                    json.append(value);
                } else if(value instanceof Boolean) {
                    json.append((Boolean)value ? "true" : "false");
                } else {
                    json.append('"').append(escape(value)).append('"');
                }
            }
        }
        json.append('}');
    }

    private static void buildJSON(Collection<Map<String, Object>> data, StringBuilder json) {
        json.append('[');
        boolean first = true;
        for(Map<String, Object> e: data) {
            if(first) {
                first = false;
            } else {
                json.append(",");
            }
            buildJSON(e, json);
        }
        json.append(']');
    }

    private static String escape(Object any) {
        if(any == null) {
            return "";
        }
        String s = any.toString();
        if(s == null) {
            return "";
        }
        for(int i = 0; i < escapeS.length; i++) {
            s = replace(s, escapeS[i], escapeR[i]);
        }
        return s;
    }

    private static String replace(String s, char c, char r) {
        int i = s.indexOf(c);
        if(i < 0) {
            return s;
        }
        return s.substring(0, i) + "\" + r + replace(s.substring(i + 1), c, r);
    }
}

请指导我实现这个目标?

答案

这意味着结果以外语编码进行编码,应使用正确的hindi文本编码进行读取。

以上是关于在codenameone中获得服务响应中的问号的主要内容,如果未能解决你的问题,请参考以下文章

如何构建一个 ios 应用程序并在 codenameone 中获得没有证书的 .ipa

无法从 HttpResponseMessage 中的发布请求中获得响应

如何使几个组件垂直调整大小以适应CodenameOne中的可用空间?

将 LWUIT 项目转换为 Codenameone 时出错

如何获得进度对话框,直到从android中的服务获得响应?

无法从网络服务获得响应