android 4.4 生僻字,Android上显示生僻字的方法
安卓5.0+是可以顯示所有(8萬多個)Unicode漢字的,本文介紹顯示生僻漢字的方法,這個方法也適用于其它特殊字符。
Unicode值在0xFFFF以下的(2萬多個簡體、繁體)漢字早已被廣泛支持,所以本文不把它們看作生僻字。
本文說的生僻字是指Unicode值在0xFFFF以上的漢字,這個范圍也叫non-BMP。
可以看這篇文章了解漢字的大致分布。
主要有4個關鍵點:
一、需使用Android 5.0以上系統。
經過我的測試,在Android 4.3.1模擬器、4.4.2模擬器上會出現問題,而在Android 5.0.2模擬器、6.0真機、7.0模擬器上正常。
問題見本文最后部分的兩張截圖:附1、附2。
二、確保字符集能覆蓋生僻字。
也就是在文件、數據庫保存字符串時使用的字符集,應該是:GB18030、UTF-8、UTF-16、UTF-32等能支持所有Unicode字符的字符集。
注意a:不要使用GB2312、GBK或BIG5字符集,它們的范圍有限,都不支持生僻字(Unicode值大于0xFFFF)。
注意b:不要在Android程序的配置xml文件里寫生僻字,Android在用UTF-8解碼這些xml時,支持的范圍并不完整。這個bug在Android 6.0里被修復。見此帖。
按如下方法把字符串讀入String后,我們進入下一個關鍵點。
byte[] b = read_bytes_from_somewhere();
String str = new String(b, "GB18030");
三、String在處理生僻字時會使用surrogate對。
Java的String使用的是UTF-16編碼。String的一個char占兩個字節,能表示0~0xFFFF之間的數值范圍。
于是,根據UTF-16的規則,在String里:常用字符(Unicode值小于等于0xFFFF)用一個char表示;剩下的字符(Unicode值大于0xFFFF)用兩個char組合表示,這兩個char叫surrogate對兒。所以我們的生僻字符須要用兩個char組合表示。
surrogate對的原理是:兩個char各有一個保留區域,這個保留區域有1,024個位置,于是1,024x1,024等于1,048,576,再加上單個char包含的字符,正好能覆蓋Unicode所有的1,114,112個位置點。
在這里,搞清楚兩個概念就可以了:
char,一個char就是一個兩字節整數。它是String的最小單位,一個String包含0個或若干個char。String對象的length()函數返回的就是char的個數。
code point,一個code point就是一個Unicode字符,一個實際的字符。在String里,它可能用1個char表示,也可能用2個char組合表示,沒有第三種可能。
所以,在處理生僻字時,String的length()函數的返回值可能大于實際字符數,想知道String的實際字符數可以用codePointCount()函數。同理,charAt()等基于char操作的函數可能也不再適用。
四、使用支持生僻字的字體。
就算程序內在支持生僻字,字體不支持也顯示不出來。包括默認字體在內的很多字體都不支持生僻字。
我們可以找一個支持生僻字的字體,然后放到程序的資源目錄里,指定程序使用它而不是系統的默認字體。
先找一個支持生僻字的字體,比如這個開心宋體:帖子,網盤。
然后按以下方法使用該字體就可以了(出處):
//得到TextView控件對象
TextView textView = (TextView) findViewById(R.id.custom);
//將字體文件保存在assets/fonts/目錄下,創建Typeface對象
Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/KaiXinSong.ttf");
//使用字體
textView.setTypeface(typeFace);
注意a:打包了字體的程序會大很多,這也是沒有辦法的事。除非做成按需下載字體,這就依賴網絡了;或者生成一個只包含所需漢字的字體文件。(2017年發布的Android Support Library v26增強了對字體的支持,見此視頻。)
注意b:各字體可能會有自己的側重點,比如支持生僻漢字的字體可能不支持emoji,支持emoji的字體可能不支持生僻漢字。
注意c:可以用SpannableString為一個字符串的部分字符使用指定的字體,見為部分字符指定字體、在SpannableString使用指定字體。
在按如上方法使用了開心宋體后,已經可以在Android 5.0.2模擬器上顯示各區漢字:
在Android 5.0.2模擬器上默認字體的效果,可以看到CJK統一漢字擴展B、C、D、E區的漢字都無法顯示:
附1,在Android 4.4.2模擬器上,使用開心宋體后,常用字反倒顯示不出來了。
在4.3.1、4.4.2上,使用Simsun-ExtB字體也有類似情況,所以這應該是安卓4.x的問題。
難道是系統不支持多于65536個字符的字體?我沒有去驗證,僅僅是猜測。
附2,在Android 4.4.2模擬器上,使用默認字體的效果:
關于Unity程序在IOS和Android上顯示內嵌網頁的方式
近期因為有須要在Unity程序執行在ios或android手機上顯示內嵌網頁.所以遍從網上搜集了一下相關的資料.整理例如以下: UnityWebCore 從搜索中先看到了這個.下載下來了以后發現這個的 ...
JS文件中的中文在網頁上顯示為亂碼解決方法
轉自:http://www.pc6.com/infoview/Article_63835.html 如果JS文件中的中文在網頁上顯示為亂碼,不妨采用本文章中的方法來試一試,或許能解決使你很頭疼的問題. ...
HTML讓文字在圖片上顯示的幾種方法
第一種方式是image 作為背景圖片,即:background:url("......."); 第二種方式是將img塊與文字塊(文字塊采用span標簽顯示)放在同一個div 中,然 ...
日期在蘋果手機上顯示NaN的處理方法
注意兩點即可: 1.蘋果只認識 yyyy/mmmm/dddd/ ?這類格式的日期 2.如果輸出后還要進行處理日期對比,蘋果默認會帶中文字,如:年月日,需要轉成上面1當中的日期格式在轉時間戳進行比較 G ...
在遠程X server上顯示圖形的設置方法
1.在服務器的/etc/ssh/sshd_config中,設置X11Forwarding yes,然后重啟ssh服務,cd /etc/init.d這個目錄下執行 ./ssh restart 2.在客戶 ...
unity,將camera設為don't clear在android上會顯示不正常
將camera設置為don't clear,在pc和ios上顯示沒問題,但在android上顯示不正常,改為only depth可以.
教你用PS制作雨天窗戶上透明水滴字
雨天窗戶上透明水滴字制作方法很簡單,主要利用圖層樣式來實現.學習后可以讓你對圖層樣式有更好的了解,認識. 先看下完成后的效果圖: 步驟1: 在Photoshop中我們新建或Ctrl+N,創建1920x ...
利用SQLite在android上實現增刪改查
利用SQLite在android上實現增刪改查 方法: 一.直接利用database.execSQL()方法輸入完整sql語句進行操作 這種方法適用于復雜的sql語句,比如多表查詢等等 這里適合于增刪 ...
Android上的MVP:如何組織顯示層的內容
MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一個演化版本,目前它在Android應用開發中越來越重要了,大家也都在討論關于M ...
隨機推薦
Bash 里的轉義序列
在 Bash 里,一共有五個地方支持反斜杠開頭的轉義序列,包括兩個內部命令 echo 和 printf 的參數里,字符串語法 $'...' 里,還有四個提示符變量 PS1-PS4 里,以及在 Read ...
CSS 去除列表項li前面的小圓點
前言 在默認的情況下,瀏覽器會在
標簽前面加上小圓點形成列表項,如下所示使用- 項1 項2 項3 或者使用
CheckBox的觸發
遇到的問題:當Checkbox選中時觸發Checked事件,使界面處于狀態1,但是頁面狀態2時也希望checkBox處于選中狀態,但是直接修改它的IsChecked屬性勢必會觸發他的Checked事件 ...
Clementine 12.0 的使用安裝(數據挖掘)
1.下載[統計數據挖掘工具].TLF-SOFT-SPSS_Clementine_v12.0-CYGiSO.bin 2.下載虛擬光驅安裝軟件 本人使用的是DTLite4402-0131. 3.如果需要漢 ...
ASP.NET WEB API構建基于REST風格
總結
以上是生活随笔為你收集整理的android 4.4 生僻字,Android上显示生僻字的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pacman主题下给Hexo增加简历类型
- 下一篇: Android 颜色渲染(九) Port