成都心情
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
主站蜘蛛池模板:
9277手机在线视频观看免费
|
中美日韩在线网免费毛片视频
|
18成禁人视频免费网站
|
国产亚洲色婷婷久久99精品
|
在线观看人成视频免费无遮挡
|
亚洲一区爱区精品无码
|
久久国产美女免费观看精品
|
亚洲欧洲日产国码无码久久99
|
国产精品免费看久久久香蕉
|
国产专区一va亚洲v天堂
|
一级成人a做片免费
|
久久亚洲色一区二区三区
|
尤物视频在线免费观看
|
国产偷国产偷亚洲清高动态图
|
中国性猛交xxxxx免费看
|
好看的电影网站亚洲一区
|
99re在线这里只有精品免费
|
亚洲熟妇无码爱v在线观看
|
69免费视频大片
|
亚洲国产成a人v在线观看
|
日韩特黄特色大片免费视频
|
欧美a级成人网站免费
|
亚洲男人的天堂网站
|
亚洲Av无码国产情品久久
|
永久免费不卡在线观看黄网站
|
精品日韩亚洲AV无码一区二区三区
|
99久久99久久精品免费看蜜桃
|
久久午夜夜伦鲁鲁片免费无码
|
亚洲AV成人无码久久精品老人
|
99久久久国产精品免费牛牛
|
亚洲午夜成人精品无码色欲
|
中国国语毛片免费观看视频
|
亚洲VA中文字幕无码一二三区
|
国产曰批免费视频播放免费s
|
亚洲欧洲无码AV不卡在线
|
免费中文字幕在线
|
一区二区在线免费观看
|
亚洲Av无码国产一区二区
|
亚洲精品无码av人在线观看
|
免费福利网站在线观看
|
久久久久久久久久免免费精品
|