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

时间:2018-03-06 04:05:40

标签: connection codenameone

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

这是我们要求的代码吗?

使用如下地图添加参数。

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[] { '"', '\\', '/', '\b', '\f', '\n', '\r', '\t' };
    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);
    }
}

请指导我实现这个目标?

1 个答案:

答案 0 :(得分:0)

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