字符串字符编码

时间:2013-12-11 14:09:10

标签: java string character-encoding

  

我们为他们开发了一个特定的出口商,允许这个位置   基于产品提供一种类型的投资组合快照 - 两者   股票和固定收益投资组合。

     

我们为他们开发了一个特定的出口商,允许这个位置   基于产品提供一种类型的投资组合快照 - 两者   股票和固定收益投资组合。

第一个文字是我从Jira复制的内容,第二个是在Cognity中打印的内容。我通过REST API以JSON格式从Jira获取文本,并使用字符串构建器对其进行格式化,最后返回一个普通的String作为输出。像" ' -等所有符号都没有正确打印,我在输出文本中得到了很多–。我该如何解决这个问题?我在想是否有某种方法可以改变输出String的编码,也许这可能有效?

修改 这就是我用来从Jira获取信息的内容,之后我从JSON返回的内容中提取了我想要的内容。

   String usercreds = "?os_username=user&os_password=password";
   try {
        url = new URL("http://jira/rest/api/2/issue/" + issuekey + usercreds);

        URLConnection urlConnection = url.openConnection();

        if (url.getUserInfo() != null) {
            String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
            urlConnection.setRequestProperty("Authorization", basicAuth);
        }

        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        while ((s = reader.readLine()) != null) {
            temp.append(s);
            s = "";
        }
        issue = new JSONObject(temp.toString());
        temp.setLength(0);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

如果我理解正确,我应该有一种方法可以指定我希望输出在此代码中的某个地方("application/json;charset=utf-8"),这可能会解决我的问题吗?

1 个答案:

答案 0 :(得分:3)

JSON响应中的破折号是U + 2013(EN DASH。)当编码为UTF-8时,如果形成字节序列e2 80 93。这些数据正在使用错误的编码进行解码(最有可能是windows-1252。)Java的默认I / O编码与系统有关。

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

上述行有错。使用InputStreamReader进行转码时,您必须指定encoding

例如:

  public static void readUtf8(URLConnection connection, Appendable out)
      throws IOException {
    CharBuffer buffer = CharBuffer.allocate(1024);
    try (InputStream in = connection.getInputStream();
    Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
      while (reader.read(buffer) != -1) {
        buffer.flip();
        out.append(buffer);
        buffer.clear();
      }
    }
  }

注意:从技术上讲,JSON可以是任何Unicode编码(不仅仅是UTF-8) - 如果您需要处理读取this

注2:HttpUrlConnection似乎自Java 5以来有所改进,但我确保它会进行自动长度处理(读取Content-Length标头/处理分块编码等)。