【问题标题】:String character encoding字符串字符编码
【发布时间】:2013-12-29 13:19:36
【问题描述】:

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

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

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

编辑: 这是我用来从 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"),这可能会解决我的问题?

【问题讨论】:

  • 您无法更改字符串的编码 - 但您可以影响字符串和字节之间的转换。不幸的是,尚不清楚您在哪里看到这些数据,以及还有什么可以帮助您。请提供更多上下文和诊断信息。
  • 原始数据在 Jira 问题的字段中,我使用 REST API 获取整个问题信息,并以 JSON 对象的形式返回给我。然后我从那个 JSON 对象中提取想要的文本并将其打印到 Confluence 页面中,并且它不会显示所述特殊字符。如果这没有帮助,请问我一个更具体的问题,以便我给你一个更好的答案。
  • 首先要做的是找出哪里坏了。在每个阶段将确切的字符记录为 UTF-16 代码单元(和字符串的长度),这将有助于查明问题。 Confluence 使用什么编码,你能影响它吗?
  • 好的,我需要做更多的研究。我不认为解决方案会那么难。当我有更多时间处理这个问题时,我会回复你。

标签: java string character-encoding


【解决方案1】:

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 标头/处理分块编码/等)

【讨论】:

  • BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 更改为BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));,一切正常。
猜你喜欢
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多