A. 在android中怎樣把utf-16的字元轉換為GBK字元用printf輸出
在java裡面應該是先轉換成newString(s,"utf-16").getBytes("gbk");這樣操作的。
不知道位元組的順序C和Java是一樣的不。原來的 JDK 中也是用char 來代表字元的,我們知道當我們想處理所有字元時1個位元組 (char) 根本不夠,所以 JDK 5 還是用回 int 來表示 code point在邏輯上一個 int 表示一個字元,而原來的 char 只能表示位元組。那麼你的 7 位元組的 unsigned int 是相當於 Java 中的什麼呢?每個 unsigned int 怎麼對應到 java 的 char[] 數組上來的?
在 Java 中內核是使用 Unicode 處理的,不存在什麼 GBK 輸出,我們已經看到字元時它就在 JVM 處理時有一個 unicode code point 了,你的 GBK 輸出是指要轉換成 GBK 位元組導出另一個系統?保存到磁碟也可以算做交換數據,不過如果只是緩存只被自己使用的話,隨便用什麼字元集保存下次再用同樣字元集讀取就可以了,哪怕保存到磁碟上是錯誤的也沒關系,只要還原過程是無損失的就可以了。那麼如果你的 printf 列印把控制台(還在內存中,不去磁碟,也不去網路另一端)就不需要考慮 byte[] 了,直接當成 Reader / Writer 這類來處理就可以了。
始終了解一點,當你不打算」交換數據「時,字元集是根本沒有任何用處的。
位元組或字元本身並沒有UTF-16和GBK的差別,主要是當我們想把它轉換成位元組時而有不同。每個字元按理說在操作系統或編程語言中會有一個unicodecodepoint與它對應(這樣的系統內核使用unicode就不存在處理不了的語言了)。因此,轉換的過程就是先讓對應到unicodecodepoint再轉換到另一個字元集編碼對應的byte[]就行了。
什麼是 unicode,看下這個圖片,那麼什麼是 UTF-8,從圖片中看到了 code point 是十六進制 0x20073 = 131187,那麼當多個字元挨在一起我們想通過網路傳送出去,如何讓對方程序知道字元的邊界在哪裡,哪幾個位元組湊在一起是一個字元,這就是字元集編碼方案了。UTF-8 只是其中一種編碼方案。
B. Android里的CharSequence是不是就是String如果是, 為什麼不直接使用String
CharSequence是一個介面,String是一個實現了CharSequence介面的類。
在JDK1.4中,引入了CharSequence介面,實現了這個介面的類有:CharBuffer、String、StringBuffer、StringBuilder這個四個類。
C. 遇到android5.0.2系統上面使用uiautomator mp 命令生成的xml文件中文亂碼怎麼解
源碼有問題,對比Android5.0.2與4.4的源碼得出,在/frameworks/testing/uiautomator/library/core-src/com/Android/uiautomator/core/AccessibilityNodeInfoDumper.java的private static String stripInvalidXMLChars(CharSequence cs)方法存在差異,改方法就是將傳入的字元轉換為字元串,如下是差異對比:
大家可以看出,左邊為5.0.2的源碼,明顯方法中只支持英文字元,其它字元統統返回問號,解決方法也很簡單,就是修改該方法,然後重新編譯刷機,自己測試中文正常顯示。