Java 字符串编码

Java 字符串编码,java,string,character-encoding,Java,String,Character Encoding,我们为他们开发了一个特定的出口商,允许他们的立场 以产品为基础,提供一种投资组合类型的快照 股票和固定收益投资组合 我们为他们开发了一个特定的出口商,允许他们的立场 基于产品,为客户提供一种投资组合 股票和固定收益投资组合 第一个文本是我从Jira复制的,第二个是在Cognity中打印的。我通过REST API以JSON格式从Jira获取文本,并使用字符串生成器对其进行格式化,最后返回一个普通字符串作为输出。所有的符号,如“-等,打印不正确,我得到了很多€“在输出文本中。我该如何解决这个问题?我

我们为他们开发了一个特定的出口商,允许他们的立场 以产品为基础,提供一种投资组合类型的快照 股票和固定收益投资组合

我们为他们开发了一个特定的出口商,允许他们的立场 基于产品,为客户提供一种投资组合 股票和固定收益投资组合

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

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

json响应中的破折号是U+2013(EN破折号)当编码为UTF-8时,if形成字节序列
e2 80 93
。此数据使用错误的编码进行解码(很可能是windows-1252)。Java的默认I/O编码取决于系统

BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
上面的行有错误。使用
InputStreamReader
进行代码转换时,必须指定一个

例如:

  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)——如果您需要处理这种读取


注2:
HttpUrlConnection
似乎自Java5以来有所改进,但我会确保它能够自动处理长度(读取
Content-length
header/处理分块编码等)

您不能更改字符串的编码-但您可能会影响字符串和字节之间的转换。不幸的是,还不清楚您在哪里看到这些数据,以及了解如何帮助您。请提供更多上下文和诊断信息。原始数据位于Jira问题的字段中,我使用REST API获取整个问题信息,作为JSON对象返回给我。然后我从该JSON对象中提取想要的文本,并在合流页面中打印出来,在合流页面中它不会显示上述特殊字符。如果这没有帮助,请问我一个更具体的问题,以便我能给你一个更好的答案。好的,第一个问题g要做的是找出它在哪里被破坏。将精确的字符记录为UTF-16代码单位(以及字符串的长度)在每个阶段,这将有助于确定问题。Confluence使用什么编码,你能影响它吗?好的,我必须做更多的研究。我不认为解决方案会那么难。当我有更多时间处理这个问题时,我会与你联系。更改
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
BufferedReader=new BufferedReader(new InputStreamReader(inputStream,UTF-8));
一切都很好。