日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android字符串块,Android字符串进阶之一(特殊字符的输入)

發布時間:2024/9/19 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android字符串块,Android字符串进阶之一(特殊字符的输入) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文按照遇到問題的思路展開:

(一)在Res下String.xml向字符串中插入“&”符號報錯

如下圖所示:

翻譯:在對實體的引用中,實體名必須緊跟在“&”后。

查找知道:這設計到HTML語言的字符集知識:

在網頁中除了可顯示常見的ASCII字符和漢字外,HTML還有許多特殊字符,它們一起構成了HTML字符集。有2種情況需要使用特殊字符,一是網頁中有其特殊意義的字符,二是鍵盤上沒有的字符。 字符集HTML字符可以用一些代碼來表示,代碼可以有2種表示方式。即字符代碼(命名實體)和數字代碼(編號實體)。字符代碼以&符開始,以分號結束,其間是字符名;數字代碼也以&符開始,以分號結束,其間是#號加編號。示例見下圖,完整的html字符集在文后Excel附件中,并非全部,僅常用。

(二)這涉及到了Android對此有專門的處理

文檔中有專門說明,如下圖所示:

字符串可以包含風格標簽(styling tag),需要注意的是:你必須轉碼(escaping)縮寫號( apostrophe即’)和引用號(quotation mark 即”或’)。你可風格化(style)和格式化(format)字符串。

1, 對縮寫號和引號的處理

文檔示例如下:

正確的轉碼是:

A:用雙引號將字符串全部圈住

B:使用轉義符號“\”

錯誤做法:

A:不處理

錯誤如下圖所示:

正確方法見上正確轉碼

B:使用html的字符代碼代替縮寫號

錯誤如下圖所示:

對以上錯誤的修正:

Note:因為xml并不是完全實時編譯,所以可以錯誤的xml語句并不當時報錯,但當項目啟動時,會報錯。

2, 格式化字符串(format string)

即字符串中保留參數位作為模板,可以傳入變量,轉換。eg,SimpleDateFormat

模板為:yyyy-MM-dd,傳入Date,得到1999-10-10

String.xml文件中代碼如下:

Hello,?%1$s!?You?have?%2$d?new?messages.

Java中代碼如下:

Resources?res?=?getResources();

String?text?=?String.format(res.getString(R.string.welcome_messages),?username,?mailCount);

有必要說明的是:

%:產生字面值,貌似是這個意思。

1$:代表第一個參數

2$:代表第二個參數

s:參數類型是字符串

d:參數類型是數字

Java代碼如下:

3, 在字符串中使用Html標記風格符號(Html makeup)

即Html的字符代碼。一步一步,終于排除到問題的可能解答處。

1. Android支持的Html元素,如下圖所示:

這三個字體標簽,能夠直接使用,稱之為“styled text”。內即為黑體字例如:

Welcome?toAndroid!

但是如果將以上的“

l “<”對應的字符代碼為:<

l “>”對應的字符代碼為:>

如下:

Hello,?%1$s!?You?have<b>%2$d?new?messages</b>.

稱之為“HTML-escaped”text,因為最終文本的顯示要為styled text,所以需要將Html-styled text轉為 styled text,調用fromHtml()方法。代碼如下:

Resources?res?=?getResources();

String?text?=?String.format(res.getString(R.string.welcome_messages),?username,?mailCount);

CharSequence?styledText?=?Html.fromHtml(text);

因為fromHtml()方法轉換的對象是html-styled,所以調用此方法之前,必須使用文本格式化(formated text)和TextUtil.htmlEncode()方法,確保所有的可能html字符已經被轉碼(escape)。如果代碼中含有特殊字符“&”“<”等,必須調用以上方法。代碼如下:

String?escapedUsername?=?TextUtil.htmlEncode(username);

Resources?res?=?getResources();

String?text?=?String.format(res.getString(R.string.welcome_messages),?escapedUsername,?mailCount);

CharSequence?styledText?=?Html.fromHtml(text);

測試:如果name中含有html character,不轉為html-styled,會有什么情況發生。

xml中字符串format如下:

Hello,?%1$s!?You?have<b>%2$d?new?messages</b>.

測試代碼如下:

publicvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Resources?rs?=?getResources();

mTextView1?=?(TextView)?findViewById(R.id.textView1);

mTextvView2?=?(TextView)?findViewById(R.id.textView2);

String?name?=?newString("");

intcount?=12345;

//未轉為html-styled

format1?=?String.format(rs.getString(R.string.welcome_messages),?name,count);

CharSequence?styledText1?=?Html.fromHtml(format1);

mTextView1.setText(styledText1);

//轉為html-styled

format2?=?String.format(rs.getString(R.string.welcome_messages),?TextUtils.htmlEncode(name),count);

CharSequence?styledText2?=?Html.fromHtml(format2);

mTextvView2.setText(styledText2);

}

模擬器顯示如下:

2. 進入TextUtil類中,htmlEncode()方法做格式化字符代碼的轉換。且Android中,只接受以上五種特殊字符。代碼如下:

/**

*?Html-encode?the?string.

*?@param?s?the?string?to?be?encoded

*?@return?the?encoded?string

*/

publicstaticString?htmlEncode(String?s)?{

StringBuilder?sb?=?newStringBuilder();

charc;

for(inti?=0;?i?

c?=?s.charAt(i);

switch(c)?{

case'

sb.append("<");//$NON-NLS-1$

break;

case'>':

sb.append(">");//$NON-NLS-1$

break;

case'&':

sb.append("&");//$NON-NLS-1$

break;

case'\'':

sb.append("'");//$NON-NLS-1$

break;

case'"':

sb.append(""");//$NON-NLS-1$

break;

default:

sb.append(c);

}

}

returnsb.toString();

}

(三)源碼中

有三處出現htmlEncode()方法。

如下圖所示:

第一處:即上文提到的TextUtils類

第二處: TextUtils的測試類,暫時不知道有什么用處

第三處:XmlParser類

定位到代碼,如下:

向上查看代碼塊描述:

顯然和之上的分析吻合。這些方法是對xml的輸出,輸出需要標準化,即 被未來的styled text(或者是其他)準確轉換convert。

(四) 流程圖

(五)單復數的處理(string format引入的問題)

文檔中說明如下:

測試各個關鍵字的效果如何。

Xml中定義plurals,如下:

Zero?song?found.

One?song?found.

Two?song?found.

Few?song?found.

Other?song?found.

Many?song?found.

代碼中如下:

publicvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

intcount1?=0;

Resources?res?=?getResources();

String?songsFound1?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count1,?count1);

TextView?textView1?=?(TextView)?findViewById(R.id.textView1);

textView1.setText(songsFound1);

intcount2?=1;

String?songsFound2?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count2,?count2);

TextView?textView2?=?(TextView)?findViewById(R.id.textView2);

textView2.setText(songsFound2);

intcount3?=2;

String?songsFound3?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count3,?count3);

TextView?textView3?=?(TextView)?findViewById(R.id.textView3);

textView3.setText(songsFound3);

intcount4?=3;

String?songsFound4?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count4,?count4);

TextView?textView4?=?(TextView)?findViewById(R.id.textView4);

textView4.setText(songsFound4);

intcount5?=4;

String?songsFound5?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count5,?count5);

TextView?textView5?=?(TextView)?findViewById(R.id.textView5);

textView5.setText(songsFound5);

intcount6?=1000;

String?songsFound6?=?res.getQuantityString(R.plurals.numberOfSongsAvailable,?count6,?count6);

TextView?textView6?=?(TextView)?findViewById(R.id.textView6);

textView6.setText(songsFound6);

}

模擬器顯示如下:

即在中文狀態下,只支持one和other兩個關鍵字。

The End!

總結

以上是生活随笔為你收集整理的android字符串块,Android字符串进阶之一(特殊字符的输入)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。