android ttf圖標(biāo)庫(kù)使用及編碼問(wèn)題

目前項(xiàng)目中使用ttf圖標(biāo)庫(kù),來(lái)展示一些app里的小圖標(biāo)黄痪。ttf文件小紧帕,且Android,IOS桅打,與H5之間可以共用一份ttf文件是嗜,具備一定的優(yōu)點(diǎn)。下面介紹下在android項(xiàng)目中的使用方法挺尾,以及碰到的編碼問(wèn)題

目前項(xiàng)目采用的ttf圖標(biāo)生成工具地址為:https://icomoon.io/app,最終提供給開(kāi)發(fā)人員的文件是“文件名.ttf”鹅搪。

ttf使用方法

  • Android開(kāi)發(fā)人員將ttf文件放在assets文件夾下。
  • 通過(guò)以下代碼為顯示ttf圖標(biāo)的TextView設(shè)置字體庫(kù)遭铺。
Typeface typeface = Typeface.createFromAsset(context.getAssets(), name);
textView.setTypeface(typeface);

上面是實(shí)例代碼丽柿,實(shí)際開(kāi)發(fā)中可根據(jù)需要進(jìn)行優(yōu)化。一種是通過(guò)自定義View繼承AppCompatTextView掂僵,該View在構(gòu)造時(shí)即設(shè)置字體庫(kù)航厚。且字體庫(kù)也可考慮做全局唯一緩存。還有一種是想到全局設(shè)置字體的方案锰蓬,可通過(guò)LayoutInflater.setFactory實(shí)現(xiàn)幔睬。方法可參考文檔LayoutInflater.setFactory學(xué)習(xí)及進(jìn)階

  • 查看ttf文件對(duì)應(yīng)的圖標(biāo)編碼芹扭,并將其在string.xml進(jìn)行定義麻顶。
    圖標(biāo)編碼

    針對(duì)上圖中的編碼,string定義如下舱卡。注意編碼必須使用\u前綴指定編碼為Unicode辅肾。
<string name="ic_eye_open_small">\ue943</string>
  • 代碼中為TextView設(shè)置該ttf圖標(biāo)編碼
textView.setText(R.string. ic_eye_open_small);

編碼問(wèn)題

使用中遇到到一些編碼問(wèn)題,在此記錄下轮锥。同時(shí)也必須感慨基礎(chǔ)知識(shí)的重要性矫钓,以及遇到不理解的解決方案時(shí)必須要有一顆“知其所以然”的恒心。

\u編碼長(zhǎng)度

\u指定了字符的編碼格式為Unicode,目前Java中表示的是UTF-16新娜,也即必須有2個(gè)字節(jié)來(lái)存儲(chǔ)Unicode編碼赵辕。
ttf圖庫(kù)中的編碼為ui人員在ttf文件生成時(shí)同時(shí)產(chǎn)生的,且可變更ttf圖標(biāo)的編碼概龄。這里我們就犯過(guò)一個(gè)錯(cuò)誤还惠,定義了e9400,e9411這種非2個(gè)字節(jié)的編碼。在string.xml中使用該編碼時(shí)私杜,最終getString獲取的內(nèi)容為""蚕键。

同時(shí)參考Unicode規(guī)范,推薦圖標(biāo)編碼使用Private Use Area區(qū)域的編碼衰粹。

\u編碼問(wèn)題

前期在Android項(xiàng)目?jī)?nèi)通過(guò)string.xml中定義锣光,引用R.string.ttf_icon_name,一直沒(méi)有遇到問(wèn)題寄猩,但是在H5向Android傳遞具體編碼時(shí)出現(xiàn)了問(wèn)題嫉晶。

因H5端字符集編碼的不同,Android收到的入?yún)⒅挥小癳943”字符串田篇。我天真的以為拼上\u就可以完成任務(wù)了替废,但是測(cè)試過(guò)程并不順利。

textView.setText(R.string. ic_eye_open_small); //OK
textView.setText("\ue943"); //OK

String text = "\ue943";
texView.setText(text);//OK

String erroText = "\\u" + "e943";
texView.setText(text);//FAIL

根據(jù)上面的測(cè)試過(guò)程泊柬,我們可猜測(cè)Java僅僅將字符串常量"\uXXXX"進(jìn)行翻譯椎镣。但是"\u" + "e943"這種最終只是得到一個(gè)存儲(chǔ)字符u,e,9,4,3的字符串。所以需要提取e943對(duì)應(yīng)的int并轉(zhuǎn)為char兽赁,再通過(guò)char拼裝String即可状答。

String text = "";
String arr = "e943";
int hexVal = Integer.parseInt(arr, 16);
text += (char)hexVal;

具體我也沒(méi)完全理解上面代碼生效的原因,實(shí)際嘗試各種轉(zhuǎn)Unicode方法均沒(méi)有成功刀崖【疲可能與char存儲(chǔ)的不是字符,而是存放字符對(duì)應(yīng)的編號(hào)有關(guān)吧亮钦。

還有一種解決方法可以嘗試馆截。

String text = "&#xe943";
Html.fromHtml(text);

“java中有個(gè)基本類型char,它占用固定的2byte空間來(lái)表示字符蜂莉,又因?yàn)閖ava設(shè)計(jì)之初就采用了Unicode編碼蜡娶,所以char能表示所有字符包括中文∮乘耄”
--- Thinking in java

char類型賦值

根據(jù)下面的char賦值規(guī)律窖张,可以理解上面方法生效的原因。

char a=’a’; //任意單個(gè)字符蚁滋,加單引號(hào)宿接。

char a=’中’;//任意單個(gè)中文字赘淮,加單引號(hào)。

char a=111;//整數(shù)睦霎。0~65535拥知。十進(jìn)制、八進(jìn)制碎赢、十六進(jìn)制均可。輸出字符編碼表中對(duì)應(yīng)的字符

參考文檔:
IconFont的制作及在Android的使用
IconFont使用文檔
https://stackoverflow.com/questions/11145681/how-to-convert-a-string-with-unicode-encoding-to-a-string-of-letters
https://stackoverflow.com/questions/28368856/how-to-convert-string-into-unicode-in-android
https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling
Java中char型變量存放的是字符嗎速梗?
Java中char和String 的深入理解 - 字符編碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肮塞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子姻锁,更是在濱河造成了極大的恐慌枕赵,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位隶,死亡現(xiàn)場(chǎng)離奇詭異拷窜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涧黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門篮昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笋妥,你說(shuō)我怎么就攤上這事懊昨。” “怎么了春宣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵酵颁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我月帝,道長(zhǎng)躏惋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任嚷辅,我火速辦了婚禮簿姨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潦蝇。我一直安慰自己款熬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布攘乒。 她就那樣靜靜地躺著贤牛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪则酝。 梳的紋絲不亂的頭發(fā)上殉簸,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天闰集,我揣著相機(jī)與錄音,去河邊找鬼般卑。 笑死武鲁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝠检。 我是一名探鬼主播沐鼠,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叹谁!你這毒婦竟也來(lái)了饲梭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焰檩,失蹤者是張志新(化名)和其女友劉穎憔涉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體析苫,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兜叨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衩侥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片国旷。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茫死,靈堂內(nèi)的尸體忽然破棺而出议街,到底是詐尸還是另有隱情,我是刑警寧澤璧榄,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布特漩,位于F島的核電站,受9級(jí)特大地震影響骨杂,放射性物質(zhì)發(fā)生泄漏涂身。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一搓蚪、第九天 我趴在偏房一處隱蔽的房頂上張望蛤售。 院中可真熱鬧,春花似錦妒潭、人聲如沸悴能。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漠酿。三九已至,卻和暖如春谎亩,著一層夾襖步出監(jiān)牢的瞬間炒嘲,已是汗流浹背宇姚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夫凸,地道東北人浑劳。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像夭拌,于是被迫代替她去往敵國(guó)和親魔熏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容