【问题标题】:How to convert UTF-8 character to ISO Latin 1?如何将 UTF-8 字符转换为 ISO Latin 1?
【发布时间】:2010-10-12 16:38:36
【问题描述】:

我需要将 UTF-8 商标标志转换为 ISO Latin 1,并将其保存到数据库中,该数据库也是 ISO Latin 1 编码的。

如何在 java 中做到这一点?

我尝试过类似的东西

String s2 = new String(s1.getBytes("ISO-8859-1"), "utf-8");

但它似乎不像我预期的那样工作。

【问题讨论】:

标签: java character-encoding


【解决方案1】:

Java 中的字符串始终采用 Unicode(UTF-16,有效)。仅当您尝试从文本转换为二进制编码时才需要转换,反之亦然。

涉及的角色是什么?你确定它甚至出现在 ISO Latin 1 中吗?如果是这样,我希望您的数据库可以毫无问题地存储该字符。没有“UTF-8 商标标志”之类的东西。您可以使用“表示商标符号 UTF-8 编码的字节”,但这将是一个字节数组,而不是字符串。

编辑:如果您的意思是Unicode trademark character U+2122,那超出了 ISO-Latin-1 的范围。有registered trademark character U+00AE,它不是一回事(无论是在外观上还是在法律意义上,IIRC)但可能总比没有好 - 如果你想使用它,那么只需使用:

string replaced = original.replace('\u2122', '\u00ae');

【讨论】:

  • 但是 和 的含义完全不同。
  • 因此“不是同一件事(无论是外观还是法律意义”
【解决方案2】:

据我了解,您正在尝试将包含非 Latin-1 字符的字符(来自 s1)存储到仅支持 ISO-8859-1 的数据库中。

  • 首先,我同意其他人的说法,这是一个肮脏的想法。
    请注意,CP1252 接近 ISO-8859-1(每个字符 1 个字节)并且包括

  • 现在,回答你的问题,我认为你做了相反的事情..
    您想将 UTF-8 字节编码为 ISO-8859-1 :

    String s2 = new String(s1.getBytes("UTF-8"), "ISO-8859-1");
    

    这样,s2 是一个字符字符串,一旦以 ISO-8859-1 编码,将返回一个看起来像有效 UTF-8 字节的字节数组。

    要检索原始字符串,您可以这样做

    String s1 = new String(s2.getBytes("ISO-8859-1"),"UTF-8");
    

但请稍等!在执行此操作时,您希望任何字节都可以使用 ISO-8859-1 进行解码 .. 并且您的数据库将接受此类数据。等等。

事实上,这真的很不确定,因为官方是ISO-8859-1 doesn't have chars for any byte values。 例如,从 80 到 9F。

那么,

byte[] b = { -97, -100, -128 };
System.out.println( new String(b,"ISO-8859-1") );

将显示???

然而,在 Java 中s.getBytes("ISO-8859-1") 确实恢复了初始数组。

【讨论】:

    【解决方案3】:
    1. 阅读 Jon Skeet 告诉你的内容。您发布的代码是垃圾(它采用您的字符串的 UTF-8 编码形式并将其解释为 ISO-8859-1,这没有任何用处)。
    2. ISO-8859-1 编码(又名 Latin1)不包含商标字符“™”。

    【讨论】:

      【解决方案4】:

      我有一个类似的问题,并通过转换实体中的不可翻译字符来解决它。 如果您稍后将信息显示为 html,则无论如何都可以。

      如果不是,您可以尝试将它们转换回 unicode。

      带有“商标”的python示例:

      s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace')
      # s is 'yellow bananas™'
      

      【讨论】:

      • 好的,但是在 Java 中?原来的问题有 #Java 标签...
      猜你喜欢
      • 1970-01-01
      • 2012-01-05
      • 2015-03-26
      • 2014-08-29
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2020-01-25
      相关资源
      最近更新 更多