我需要将UTF-8商标标志转换为ISO Latin 1,并将其保存到数据库中,该数据库也是ISO Latin 1编码。
我怎么能在java中做到这一点?
我尝试过像
这样的东西String s2 = new String(s1.getBytes("ISO-8859-1"), "utf-8");
但似乎没有按照我的预期发挥作用。
答案 0 :(得分:5)
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');
答案 1 :(得分:4)
据我了解,您试图将包含非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 doesn't have chars for any byte values。 例如,从80到9F。
然后,
byte[] b = { -97, -100, -128 };
System.out.println( new String(b,"ISO-8859-1") );
会显示???
但是, in Java ,s.getBytes("ISO-8859-1")
确实恢复了初始数组。
答案 2 :(得分:2)
答案 3 :(得分:0)
我遇到了类似的问题,并通过转换实体中不可翻译的字符来解决它。 如果您稍后将信息显示为html,则无论如何都可以。
如果没有,您可以尝试将它们转换回unicode。
带有“商标”的python示例:
s = u'yellow bananas\u2122'.encode('latin1', 'xmlcharrefreplace')
# s is 'yellow bananas™'