繁体   English   中英

如何将UTF-8字符转换为ISO Latin 1?

[英]How to convert UTF-8 character to ISO Latin 1?

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

我怎么能在java中这样做?

我尝试过类似的东西

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

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

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

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

编辑:如果你的意思是Unicode商标字符 U + 2122,那就超出了ISO-Latin-1的范围。 注册商标字符 U + 00AE,这是不一样的(无论是在外观上还是在法律意义上,IIRC)但可能总比没有好 - 如果你想使用它,那么只需使用:

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

据我所知,您试图将包含非Latin-1字符的字符(从s1 )存储到仅支持ISO-8859-1的DB中。

  • 首先,我同意其他人说这是一个肮脏的想法。
    请注意, 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没有任何字节值的字符 例如,从80到9F。

然后,

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

会显示???

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

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

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

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

python中带有“商标”的示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM