簡體   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