2011-10-30 118 views
1

我有一個字符串\u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF。 我需要將它轉換爲ANSI格式的Avwg wKse w-i K_v ejwQ`。如何將此Unicode轉換爲Java中的ANSI字符。Java-從unicode轉換爲ANSI

編輯:

resultView.setTypeface(typeFace); 
String str=new String("\u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF");    
resultView.setText(str); 
+0

缺少typeFace和resultView的定義 –

+0

ya ...我有他們的定義在類 –

+1

的頂部,但什麼是resultView?什麼是typeFace? Android是Java嗎? –

回答

1

我不知道你問什麼,但我會假設你問如何某些字符轉換從Unicode爲8位字符集。 (例如,ISO-8859-1是「西歐」語言的字符集,如英語)。

我不知道有任何方法可以自動檢測相關的8位字符集,所以我查了一下你的一個字符(在這裏http://unicode.org/charts/),我可以看到這些字符是孟加拉語。

認爲孟加拉語相當於8位字符集稱爲x-iscii-be我沒有安裝在我的系統上,所以我無法成功完成轉換。

編輯:Java不支持字符集x-iscii-be,但我將留下此答案的其餘部分用於說明目的。請參閱http://download.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html以獲取支持的字符集列表。編輯2:Android當然不保證支持這個字符集(它保證是唯一的8位字符集是ISO-8859-1)。參見:http://developer.android.com/reference/java/nio/charset/Charset.html

* 所以,我認爲你應該在孟加拉的Android設備上運行一些Charset檢測代碼 - 也許它支持這個字符集。你需要的一切都在我的代碼示例中。 *

爲了讓Java以不同的字符集轉換您的數據,您需要在Java中執行的所有操作都是檢查是否安裝了所需的Charset,然後在將字符串轉換爲字節時指定所需的字符集。

轉換本身是非常簡單的:

str.getBytes("x-iscii-be"); 

所以,你看,字符串本身存儲在一種「規範化」形式(即defaultCharset),並且可以治療的getBytes( charsetName)作爲字符串的'替代輸出格式'。 對不起 - 可憐的解釋!

在你的情況,或許你只需要一個字符集分配到resultView,而框架將工作它的魔力爲你...

下面是一些測試代碼,我放在一起,以說明這一點,和檢查系統上是否支持給定的字符集。

我有這個代碼來輸出字​​節數組作爲'十六進制'字符串,以便您可以看到轉換後的數據是不同的。

import java.io.UnsupportedEncodingException; 
import java.math.BigInteger; 
import java.nio.charset.Charset; 
import java.util.Map.Entry; 
import java.util.SortedMap; 

public class UnicodeTest { 
    public static void main(String[] args) throws UnsupportedEncodingException { 
     testWestern(); 
     testBengali(); 
    } 

    public static void testWestern() throws UnsupportedEncodingException { 
     String unicodeStr= "\u00c2"; //This is a capital A with an accent.; 
     String charsetName= "ISO-8859-1"; 
     System.out.println("Input (outputted as default charset - normally unicode): "+unicodeStr); 
     attempt8bitCharsetConversion(unicodeStr, charsetName); 
    } 

    public static void testBengali() throws UnsupportedEncodingException { 
     String unicodeStr = "\u0986\u09AE\u09BF \u0995\u09BF\u0982\u09AC\u09A6\u09A8\u09CD\u09A4\u09BF\u09B0 \u0995\u09A5\u09BE \u09AC\u09B2\u099B\u09BF"; 
     String charsetName= "x-iscii-be"; 
     System.out.println(unicodeStr); 
     attempt8bitCharsetConversion(unicodeStr, charsetName); 
    } 

    public static void attempt8bitCharsetConversion(String input, String charsetName) throws UnsupportedEncodingException { 
     SortedMap<String, Charset> availableCharsets = Charset 
       .availableCharsets(); 
     for (Entry<String, Charset> entry : availableCharsets.entrySet()) { 
      if (charsetName.equalsIgnoreCase(entry.getKey())) { 
       System.out.println("HEXED input : "+ toHex(input.getBytes(Charset.defaultCharset().name()))); 
       System.out.println("HEXED output: "+ toHex(input.getBytes(entry.getKey()))); 
      } 
     } 
     throw new UnsupportedEncodingException(charsetName+ " is not supported on this system"); 
    } 

    public static String toHex(byte[] input) throws UnsupportedEncodingException { 
     return String.format("%x", new BigInteger(input)); 
    } 
} 

也看到這裏的更多信息,字符集轉換:http://download.oracle.com/javase/tutorial/i18n/text/string.html

Charactersets是一個棘手的業務,所以請原諒我費解的答案。

HTH

+0

它顯示異常,當我調用testBengali()方法。 –

+0

啊。我認爲你的孟加拉語操作系統會支持這個字符集。但是,在進一步閱讀中,(Oracle)Java不支持它。請參閱此處以獲取受支持的字符編碼列表:http://download.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html – laher

+0

我剛剛檢查了android文檔,而Android本身只保證unicode + ascii + ISO-8859-1的可用性。也許一些爲孟加拉市場生產的手機確實支持它?我建議你嘗試在目標手機上運行一些代碼,檢查它是否支持charset – laher

6

我需要將其轉換成AvwgwKsewš—i K_v ejwQ這是ANSI格式。

這不是ANSI格式。 Windows中的「ANSI」代碼頁面都是基於ASCII的,在高字節中添加了不同的字符。字節0x41(A)作爲ANSI代碼頁中的前導字母始終表示拉丁語A而非孟加拉語

我認爲你有一個自定義符號字體,它將任意符號映射到完全無關的代碼點。每種這樣的字體都有自己的視覺編碼;要在Unicode與自定義視覺編碼之間進行轉換,您必須通過查看每個字符的字形並將它們與代表相同字母的Unicode字符進行匹配來構建自己的翻譯表。

我強烈建議取得一個支持孟加拉的正確的支持Unicode的字體。內容卡在一個任意字體特定的編碼很難處理(因爲語義上你真的正在處理一個字符串,這意味着「AvwgwKsewš-i K_v ejwQ」,所有的編輯和病例變化陷阱意味着

視覺編碼的字體是一個不愉快的時間,在Windows有很好的Unicode(甚至是ISCII)支持之前的時間。他們不應該用於今天的任何事情。

+0

很棒的回答。但是我懷疑Windows是否真的有很好的Unicode支持。人們在控制檯上使用UTF-8時會遇到很多麻煩,透明地使用來自所有平面的代碼點,生成沒有虛假BOM等的UTF-8流等。 – tchrist

+0

@tchrist:當然,UTF-8是Windows下的二等公民,「代碼頁65001」的默認C stdlib處理被嚴重破壞(這是命令提示符無法很好地完成Unicode的原因之一,但後來命令提示符是一個可怕的遺物)。其餘的不壞,在大多數前端的東西中,非BMP字符通常工作正常。 – bobince

+1

令人遺憾的是Windows被UTF-16的詛咒所困擾,特別是它保留了特定於語言環境的「ANSI」代碼頁作爲窄字符串處理的默認設置,甚至到了今天(而不是UTF-8,所有其他現代操作系統使用)。但是你可以看到它是如何發生的,NT是在UTF-8發明之前設計的。那時候Unicode的人們確實認爲每個人都會轉向使用雙字節代碼單元來處理字符IO。微軟試圖變得現代化,Windows被困在一個尚未準備好的標準中。 – bobince

0

我寫了一個類,它可以解決09CB的問題ো ,09CCৌ,09C7ে,09C8ৈ,09BFিি্য্্্,ৃৃৃৃৃৃৃৃৃৃৃৃৃৃI I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I font font font I font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font font解決你的孟加拉共軛爲了適當的渲染它需要Android 3.5或更高版本,它會在Android 4.0(冰淇淋沙)