成都心情
BlogJava
::
首頁
:: ::
聯(lián)系
::
聚合
::
管理
::
98 隨筆 :: 2 文章 :: 501 評論 :: 1 Trackbacks
公告
本作品采用
知識共享署名-相同方式共享 2.5 中國大陸許可協(xié)議
進(jìn)行許可。
(15)
給我留言
查看公開留言
查看私人留言
隨筆分類
(91)
Java EE 服務(wù)器端(13)
(rss)
Java EE 表現(xiàn)層及容器(12)
(rss)
Java ME(1)
(rss)
Java 基礎(chǔ)(10)
(rss)
MatLab(1)
(rss)
O/R Mapping(13)
(rss)
Versant db4o 中文項(xiàng)目(12)
(rss)
Web前端技術(shù)
(rss)
五花八門(8)
(rss)
大數(shù)據(jù)(3)
(rss)
工作流(10)
(rss)
數(shù)據(jù)庫(2)
(rss)
模式與策略(6)
(rss)
隨筆檔案
(99)
2016年7月 (2)
2016年6月 (4)
2016年5月 (3)
2016年4月 (2)
2010年7月 (1)
2010年6月 (2)
2010年5月 (3)
2010年3月 (1)
2010年1月 (1)
2009年10月 (1)
2009年9月 (1)
2009年7月 (1)
2009年6月 (1)
2009年3月 (1)
2009年2月 (1)
2008年12月 (2)
2008年9月 (1)
2008年8月 (1)
2008年7月 (1)
2008年6月 (1)
2008年4月 (1)
2008年3月 (1)
2008年1月 (1)
2007年12月 (2)
2007年10月 (1)
2007年9月 (1)
2007年8月 (1)
2007年6月 (2)
2007年5月 (1)
2007年4月 (1)
2007年2月 (1)
2007年1月 (1)
2006年12月 (1)
2006年11月 (1)
2006年10月 (1)
2006年9月 (1)
2006年8月 (1)
2006年7月 (1)
2006年6月 (1)
2006年5月 (1)
2006年4月 (1)
2006年3月 (1)
2006年2月 (1)
2006年1月 (1)
2005年12月 (1)
2005年11月 (1)
2005年10月 (1)
2005年9月 (2)
2005年8月 (37)
文章分類
(2)
我的收藏(2)
(rss)
友情鏈接
david.turing
(rss)
wyingquan的專欄
(rss)
信息安全思想
俺的豬窩~!@
喜馬拉雅的雪杉
(rss)
無聊人士
(rss)
竹十一
(rss)
老劉忙不忙
(rss)
邢紅瑞的blog
(rss)
積分與排名
積分 - 634309
排名 - 74
最新評論
1.?re: 精確截取字符串(轉(zhuǎn)載)
string=goodStr(string); 這個(gè)方法 是干什么用處的?
--JustPassoner
2.?re: 精確截取字符串(轉(zhuǎn)載)
@國家機(jī)器
六六,認(rèn)識你是我等榮幸,酒瘋知己千杯燒...
--JustPassoner
3.?re: 使用Memory Analyzer tool(MAT)分析內(nèi)存泄漏(二)[未登錄]
樓主可以去看看一篇jvm的連載 公眾號 ITmenghuo
--dddd
4.?re: 使用Memory Analyzer tool(MAT)分析內(nèi)存泄漏(一)
小瑕疵。
圖片顯示不了。
--袁良錠
5.?re: Hadoop周刊—第 169 期
喲,又開始更新了
--救救劉書記
閱讀排行榜
1.?使用Memory Analyzer tool(MAT)分析內(nèi)存泄漏(二)(121240)
2.?使用Memory Analyzer tool(MAT)分析內(nèi)存泄漏(一)(75947)
3.?Java 中的位運(yùn)算(31039)
4.?Ajax輪詢以及Comet模式—寫在Servlet 3.0發(fā)布之前(15641)
5.?RBAC 模型初探(13699)
評論排行榜
1.?德國申根商務(wù)簽證攻略(成都版)(36)
2.?OSWorkflow 探索(29)
3.?北漂找工作經(jīng)歷(26)
4.?使用Memory Analyzer tool(MAT)分析內(nèi)存泄漏(一)(23)
5.?開源面向?qū)ο髷?shù)據(jù)庫 db4o 之旅: 初識 db4o“db4o 之旅(一)”(21)
精確截取字符串(轉(zhuǎn)載)
開發(fā)中經(jīng)常遇到,字符串過長,無法完全顯示的問題
這時(shí)候就需要截取我們所需要的長度,后面顯示省略號或其他字符。
由于中文字符占兩個(gè)字節(jié),而英文字符占用一個(gè)字節(jié),所以,單純地判斷字符數(shù),效果往往不盡如人意
下面的方法通過判斷字符的類型來進(jìn)行截取,效果還算可以:)
如果大家有其他的解決方法歡迎貼出來,共同學(xué)習(xí):)
**********************************************************************
private String str;
private int counterOfDoubleByte;
private byte b[];
/**
* 設(shè)置需要被限制長度的字符串
* @param str 需要被限制長度的字符串
*/
public void setLimitLengthString(String str){
this.str = str;
}
/**
* @param len 需要顯示的長度(<font color="red">注意:長度是以byte為單位的,一個(gè)漢字是2個(gè)byte</font>)
* @param symbol 用于表示省略的信息的字符,如“...”,“>>>”等。
* @return 返回處理后的字符串
*/
public String getLimitLengthString(int len, String symbol) throws UnsupportedEncodingException {
counterOfDoubleByte = 0;
b = str.getBytes("GBK");
if(b.length <= len)
return str;
for(int i = 0; i < len; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
if(counterOfDoubleByte % 2 == 0)
return new String(b, 0, len, "GBK") + symbol;
else
return new String(b, 0, len - 1, "GBK") + symbol;
}
本文轉(zhuǎn)貼自網(wǎng)友:focus2004 的文章
posted on 2005-08-12 15:39
Rosen
閱讀(8654)
評論(15)
編輯
收藏
所屬分類:
Java EE 服務(wù)器端
評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2005-08-19 08:27
ivan
if(b<0) 編譯會出錯(cuò)。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2005-08-19 20:39
Rosen
馬上修改一下代碼,去年轉(zhuǎn)貼的時(shí)候一直忘記修改了。
是 if(b[i] < 0),謝謝 ivan 指正。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2006-01-28 18:24
tdg
大作拜讀,有一點(diǎn)愚見,特拋磚引玉:
1。字符串除了可以基于byte[]操作外,還可以基于char[]操作。看老大你的意圖是想截取字符串的前幾個(gè)字符然后加上省略符號最后輸出而已,完全不必考慮用byte[]數(shù)組操作啊 。而且好像開發(fā)中更注重語義上的第幾個(gè)字符而不是你說的這種情況哦。
2。以下是拙作,請斧正:
/**
* 字符串截取函數(shù)
* @param str String 要處理的字符串
* @param length int 需要顯示的長度
* @param symbol String 用于表示省略的信息的字符,如“...”,“>>>”等
* @return String 返回處理后的字符串
* @throws UnsupportedEncodingException
*/
public String getLimitLengthString(String str, int length, String symbol) throws
UnsupportedEncodingException {
assert str != null;
assert length > 0;
assert symbol != null;
//如果字符串的位數(shù)小于等于要截取的位數(shù),附加上表示省略的信息的字符串后返回
if (str.length() <= length) {
return str + symbol;
//從零開始,截取length個(gè)字符,附加上表示省略的信息的字符串后返回
} else {
str = new String(str.getBytes("GBK"));
char[] charArray = str.toCharArray();
char[] charArrayDesc = new char[length];
System.arraycopy(charArray, 0, charArrayDesc, 0, length);
return new String(charArrayDesc) + symbol;
}
}
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2006-01-28 20:03
Rosen
呵呵 tdg 兄很認(rèn)真喔,談不上斧正。主要是這個(gè)問題,用 char 處理,如果是字母或者數(shù)字,實(shí)際上截取出來的會比漢字少占用一半的空間,所以截取出來后,還是不能對齊。而實(shí)際上 char 數(shù)組中,不管是字母、數(shù)字還是漢字,它們都只代表一個(gè)單元。但是 byte 則不同,字母、數(shù)字只占用一個(gè)字節(jié),而漢字占用兩個(gè)字節(jié)(都是GBK編碼)。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2006-03-24 10:49
istarliu
您好!
你的文章讓我受益不少,有個(gè)問題想向您確認(rèn)一下:
在代碼中
b = str.getBytes("GBK");
if(b.length <= len)
return str;
for(int i = 0; i < len; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
是不是如果只要是中文漢字,在b[i]對應(yīng)的值都是小于0的,
也就是說,在漢字代表的兩個(gè)字節(jié)中,這兩個(gè)漢字分別轉(zhuǎn)化為整數(shù)值時(shí),是不是一定小于0,但值范圍不能小于-127的。做過測試,不能肯定。:)
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2006-03-30 17:42
Rosen
istarliu,這里要強(qiáng)調(diào)一下,GBK、GB2312 雙字節(jié)編碼字節(jié)才是負(fù)的。UTF-8 三字節(jié)編碼未去核實(shí)。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-01-19 16:28
lyazure
無意義的做法, 犯了常識錯(cuò)誤, java內(nèi)部表示任何字符都是16位, 而且不涉及輸入輸出操作不需要字符解碼編碼操作.不知道文中的"單純地判斷字符數(shù)效果并不理想"的結(jié)論如何得出,恐怕只是臆斷.事實(shí)上只需根據(jù)字符數(shù)截取即可.
public String getLimitLengthString(String srcString, int expectLength){
if(srcString.length() <= expectLength) return srcString;
return srcString.subString(0, expectLength);
}
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-01-19 23:19
Rosen
@lyazure
我只想說一句,請驗(yàn)證后再回答,最好能打印在 html 頁面中,然后混合漢字和數(shù)字輸出,看看長短是否一致。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-01-20 07:08
lyazure
不知Rosen驗(yàn)證原文中代碼用的是怎樣的例子,能否可以提供一個(gè)我不能處理的字符串或者這樣的情境?
從文中的涉及對字符解碼操作來看, 接收到的參數(shù)字符串并未正確解碼, 關(guān)鍵不在字符長度處理的問題.只需先對字符串進(jìn)行正確解碼.
String desString = new String(srcString.getBytes("ISO-8859-1"), "GBK");
之后所有字符操作都可以正常進(jìn)行,不會出現(xiàn)字符長度問題.
另外,從文中的意義看來, 原文對字符的解碼應(yīng)當(dāng)用ISO-8859-1,而不是GBK,當(dāng)然,因?yàn)镚BK向下兼容ISO-8859-1,因此從結(jié)果來說并沒有問題.
之前的評論有些詞語過激,希望Rosen不要往心里去. 但似乎Rosen的回答馬上有針鋒相對的味道,呵呵.希望是我多慮了.
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-01-20 14:07
Rosen
@lyazure
還不是很激動,只是感覺本文的意思沒有完全表達(dá)清楚,應(yīng)該再加點(diǎn)描述,比如這樣的例子:
字符串“中文中文2222”,當(dāng)直接截取srcString.substring(0, 4)時(shí),“中文中文”這四個(gè)字會正確打印出來,沒錯(cuò)。不過如果我們把字符串改為“2222中文中文”,那么打印出來的應(yīng)該是“2222”。
這個(gè)時(shí)候輸出到 html 是這樣的:
中文中文
2222
可以看到,雖然我都是截取的同樣長度,但是頁面卻很不美觀,長短不一,一個(gè)現(xiàn)實(shí)中的例子,當(dāng)然也是我一直沒有糾正過來的錯(cuò)誤,
http://www.cdcin.com
,你看首頁的“新聞信息”欄目,當(dāng)出現(xiàn)標(biāo)題有數(shù)字的情況時(shí),就顯得很不統(tǒng)一,參差不齊。
所以,這就是本文為什么要討論按照編碼規(guī)則來截取字符串的原因。當(dāng)然,這樣處理并不會徹底的解決不整齊,但是總會好些,比如哪天發(fā)布某條全是數(shù)字和字母的標(biāo)題,那這種參差不齊就太嚴(yán)重了。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-01-20 18:38
lyazure
看來我理解錯(cuò)了,原來是為了獲得一致的顯示寬度.
回復(fù)
更多評論
#
我的做法
2007-04-24 15:16
國家機(jī)器
/***
* 字符串的單個(gè)字符是否是漢字
* @param c
* @return
*/
public static int ascii(String c)
{
byte x[] = new byte[2];
x = c.getBytes();
if (null == x || x.length > 2 || x.length <=0)
{
return 0;
}
if( x.length == 1){ //英文字符
return x[0];
}
if (x.length == 2)
{
int hightByte = 256 + x[0];
int lowByte = 256 + x[1];
int ascii = (256 * hightByte + lowByte) - 256 * 256;
return ascii;
}
return 0;
}
/***
* 顯示字符串的前N個(gè)字符
* 此處著重處理了英文字符和中文字符在顯示上的一致性;
* 2個(gè)英文字符和一個(gè)漢字占據(jù)的寬度一致;
*/
public static String limitStr(String string, int size)
{
if (null != string)
{
string = goodStr(string);
if (string.length() <= size)
{
return string;
}
else
{
StringBuffer buffer = new StringBuffer();
double len = 0;
for (int i = 0; i < string.length(); i++)
{
//是否漢字 ascii<0
String str = string.substring(i,i+1);
if (ascii(str) < 0 )
{
buffer.append(str);
len ++ ;
}
else
{
buffer.append(str);
len = len + 0.5;
}
if (len >= size) break;
}
return buffer.toString();
}
}
return "";
}
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2007-05-14 11:44
Rosen
@國家機(jī)器
呵呵,感謝貢獻(xiàn),你的做法更精確了。
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2016-08-18 17:22
JustPassoner
@國家機(jī)器
六六,認(rèn)識你是我等榮幸,酒瘋知己千杯燒...
回復(fù)
更多評論
#
re: 精確截取字符串(轉(zhuǎn)載)
2016-08-18 17:56
JustPassoner
string=goodStr(string); 這個(gè)方法 是干什么用處的?
回復(fù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
Servlet的異步轉(zhuǎn)同步調(diào)用
利用 iText 實(shí)現(xiàn) PDF 報(bào)表下載
OSGi起步(OSGi for Beginners)
Java 生成 JPG 縮略圖
Apache FileUpload 上傳以及 JExcelApi 解析
JBI-Java 實(shí)現(xiàn) SOA 的標(biāo)準(zhǔn)途徑(翻譯)
與 Axis 1.x 同行
BIRT 總覽(翻譯)
XML 的 RUD
四種 XML 解析技術(shù)之不完全測試
Powered by:
BlogJava
Copyright © Rosen
主站蜘蛛池模板:
成在人线av无码免费高潮水
|
国产亚洲大尺度无码无码专线
|
亚洲视频在线观看2018
|
亚洲成a人片在线观看中文!!!
|
亚洲视频一区在线播放
|
亚洲视频在线一区二区三区
|
亚洲另类激情综合偷自拍
|
91福利免费视频
|
桃子视频在线观看高清免费完整
|
xxxxx免费视频
|
毛片视频免费观看
|
日韩人妻无码免费视频一区二区三区
|
最新猫咪www免费人成
|
午夜毛片不卡免费观看视频
|
免费人成年激情视频在线观看
|
77777亚洲午夜久久多人
|
久久久久亚洲精品影视
|
亚洲一级免费毛片
|
亚洲中文精品久久久久久不卡
|
豆国产96在线|亚洲
|
国产福利电影一区二区三区,免费久久久久久久精
|
亚洲精选在线观看
|
亚洲午夜久久久精品电影院
|
亚洲AV无码一区二区三区牲色
|
国产高清视频免费在线观看
|
一级毛片成人免费看免费不卡
|
桃子视频在线观看高清免费完整
|
麻豆国产人免费人成免费视频
|
亚洲一级片内射网站在线观看
|
亚洲AV日韩精品久久久久久久
|
国产AV无码专区亚洲AV男同
|
国产啪精品视频网免费
|
亚洲中文字幕久久精品无码喷水
|
亚洲精品tv久久久久久久久
|
亚洲第一中文字幕
|
亚洲制服中文字幕第一区
|
91嫩草亚洲精品
|
黄页网站在线观看免费
|
最近中文字幕免费2019
|
四虎成人精品在永久免费
|
亚洲国产精品无码AAA片
|