[英]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")
确实恢复了初始数组。
我遇到了类似的问题,并通过转换实体中不可翻译的字符来解决它。 如果您稍后将信息显示为html,则无论如何都可以。
如果没有,您可以尝试将它们转换回unicode。
python中带有“商标”的示例:
s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace')
# s is 'yellow bananas™'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.