[英]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.