当前位置: 首页 > 面试题库 >

在Java中将UTF-8转换为ISO-8859-1

申屠裕
2023-03-14
问题内容

我正在阅读XML文档(UTF-8),并最终使用ISO-8859-1在网页上显示内容。正如预期的那样,有几个字符显示不正确,比如(他们显示为?)。

是否可以将这些字符从UTF-8转换为ISO-8859-1?

这是我编写的尝试此功能的代码段:

BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
StringBuilder sb = new StringBuilder();

String line = null;
while ((line = br.readLine()) != null) {
  sb.append(line);
}
br.close();

byte[] latin1 = sb.toString().getBytes("ISO-8859-1");

return new String(latin1);

我不太确定发生了什么问题,但是我认为是re​​adLine()引起了麻烦(因为字符串将是Java /
UTF-16编码的?)。我尝试的另一种变化是将latin1替换为

byte[] latin1 = new String(sb.toString().getBytes("UTF-8")).getBytes("ISO-8859-1");

我已经阅读了有关该主题的先前文章,并且正在学习中。在此先感谢您的帮助。


问题答案:

我不确定标准库中是否有将执行此操作的规范化例程。我不认为标准的Unicode规范化程序会处理“智能”引号的转换-
但不要引用我。

明智的做法是转储ISO-8859-1并开始使用UTF-8。也就是说,可以将任何通常允许的Unicode代码点编码为HTML网页,编码为ISO-8859-1。您可以使用转义序列对它们进行编码,如下所示:

public final class HtmlEncoder {
  private HtmlEncoder() {}

  public static <T extends Appendable> T escapeNonLatin(CharSequence sequence,
      T out) throws java.io.IOException {
    for (int i = 0; i < sequence.length(); i++) {
      char ch = sequence.charAt(i);
      if (Character.UnicodeBlock.of(ch) == Character.UnicodeBlock.BASIC_LATIN) {
        out.append(ch);
      } else {
        int codepoint = Character.codePointAt(sequence, i);
        // handle supplementary range chars
        i += Character.charCount(codepoint) - 1;
        // emit entity
        out.append("&#x");
        out.append(Integer.toHexString(codepoint));
        out.append(";");
      }
    }
    return out;
  }
}

用法示例:

String foo = "This is Cyrillic Ya: \u044F\n"
    + "This is fraktur G: \uD835\uDD0A\n" + "This is a smart quote: \u201C";

StringBuilder sb = HtmlEncoder.escapeNonLatin(foo, new StringBuilder());
System.out.println(sb.toString());

上面的字符左双引号(U+201C )被编码为&#x201C;。同样,对其他两个任意代码点也进行了编码。

需要谨慎使用此方法。如果您的文本需要针对HTML进行转义,则需要在上述代码或“与”号最终转义之前完成。



 类似资料:
  • 问题内容: 有谁知道如何将字符串从ISO-8859-1转换为UTF-8并重新转换为Java? 我从网络上获取一个字符串并将其保存在RMS(J2ME)中,但是我想保留特殊字符并从RMS中获取字符串,但要使用ISO-8859-1编码。我该怎么做呢? 问题答案: 通常,你无法执行此操作。UTF-8能够编码任何Unicode代码点。ISO-8859-1只能处理其中的一小部分。因此,从ISO-8859-1转

  • 问题内容: 我正在尝试将UTF-8中Java编码的字符串转换为ISO-8859-1。例如,在字符串“âabcd”中,“â”在ISO-8859-1中表示为E2。在UTF-8中,它表示为两个字节。C3 A2我相信。当我执行getbytes(encoding),然后使用ISO-8859-1编码的字节创建一个新字符串时,我得到两个不同的字符。â。还有其他方法可以使字符保持一致,即abcd吗? 问题答案:

  • 问题内容: 我正在制作一个javascript应用程序,该应用程序使用jquery 检索文件并将数据注入到其所嵌入的网页中。 这些文件使用UTF-8编码,并包含重音字符,例如é,ö和å。 问题是我无法控制将要使用该应用程序的页面上的字符集。 有些将使用UTF-8,但其他一些将使用iso-8859-1字符集。这当然会使文件中的特殊字符乱码。 如何使用JavaScript将特殊的UTF-8字符转换为等

  • 问题内容: 我有一个带有HTML实体的ASCII字符串,例如: 我需要此字符串不包含那些实体,并将其转换为UTF-8字符。有没有简单的方法,在Java中可以做到这一点? 哪里: 返回“aà” 或类似的东西? 问题答案: 看一下org.apache.commons.lang.StringEscapeUtils.unescapeHtml(…)。显然,它可以理解HTML 4中定义的所有字符实体。

  • 问题内容: 我的软件在UTF8中得到的字符串比我转换为ISO 8859 1所需的字符串多。我知道UTF8域比iso 8859大。但是UTF8中的数据先前已从ISO上转换,所以我不应该错过任何内容。 我想知道是否存在从UTF8转换为iso-8859-1的简单/直接方法。 谢谢 问题答案: 这是您可能会发现有用的功能:。它可以转换为(包括欧元,但没有),但是对于-> -> 往返的-> 转换部分,它也可

  • 问题内容: 我们有一个系统,客户(主要是欧洲人)输入的文本(使用UTF-8)必须分发到不同的系统,其中大多数接受UTF-8,但是现在我们还必须将文本分发到仅接受美国的美国系统。 -Ascii 7位 因此,现在我们需要将所有欧洲字符翻译成最近的美国Ascii。是否有任何Java库可帮助完成此任务? 现在,我们刚刚开始添加到转换表中,在该表中Å(瑞典AA)-> A等,在找不到与输入字符匹配的位置的情况