成都心情
BlogJava
::
首頁
:: ::
聯系
::
聚合
::
管理
::
98 隨筆 :: 2 文章 :: 501 評論 :: 1 Trackbacks
公告
本作品采用
知識共享署名-相同方式共享 2.5 中國大陸許可協議
進行許可。
(15)
給我留言
查看公開留言
查看私人留言
隨筆分類
(91)
Java EE 服務器端(13)
(rss)
Java EE 表現層及容器(12)
(rss)
Java ME(1)
(rss)
Java 基礎(10)
(rss)
MatLab(1)
(rss)
O/R Mapping(13)
(rss)
Versant db4o 中文項目(12)
(rss)
Web前端技術
(rss)
五花八門(8)
(rss)
大數據(3)
(rss)
工作流(10)
(rss)
數據庫(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)
積分與排名
積分 - 634229
排名 - 74
最新評論
1.?re: 精確截取字符串(轉載)
string=goodStr(string); 這個方法 是干什么用處的?
--JustPassoner
2.?re: 精確截取字符串(轉載)
@國家機器
六六,認識你是我等榮幸,酒瘋知己千杯燒...
--JustPassoner
3.?re: 使用Memory Analyzer tool(MAT)分析內存泄漏(二)[未登錄]
樓主可以去看看一篇jvm的連載 公眾號 ITmenghuo
--dddd
4.?re: 使用Memory Analyzer tool(MAT)分析內存泄漏(一)
小瑕疵。
圖片顯示不了。
--袁良錠
5.?re: Hadoop周刊—第 169 期
喲,又開始更新了
--救救劉書記
閱讀排行榜
1.?使用Memory Analyzer tool(MAT)分析內存泄漏(二)(121240)
2.?使用Memory Analyzer tool(MAT)分析內存泄漏(一)(75947)
3.?Java 中的位運算(31038)
4.?Ajax輪詢以及Comet模式—寫在Servlet 3.0發布之前(15639)
5.?RBAC 模型初探(13697)
評論排行榜
1.?德國申根商務簽證攻略(成都版)(36)
2.?OSWorkflow 探索(29)
3.?北漂找工作經歷(26)
4.?使用Memory Analyzer tool(MAT)分析內存泄漏(一)(23)
5.?開源面向對象數據庫 db4o 之旅: 初識 db4o“db4o 之旅(一)”(21)
精確截取字符串(轉載)
開發中經常遇到,字符串過長,無法完全顯示的問題
這時候就需要截取我們所需要的長度,后面顯示省略號或其他字符。
由于中文字符占兩個字節,而英文字符占用一個字節,所以,單純地判斷字符數,效果往往不盡如人意
下面的方法通過判斷字符的類型來進行截取,效果還算可以:)
如果大家有其他的解決方法歡迎貼出來,共同學習:)
**********************************************************************
private String str;
private int counterOfDoubleByte;
private byte b[];
/**
* 設置需要被限制長度的字符串
* @param str 需要被限制長度的字符串
*/
public void setLimitLengthString(String str){
this.str = str;
}
/**
* @param len 需要顯示的長度(<font color="red">注意:長度是以byte為單位的,一個漢字是2個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;
}
本文轉貼自網友:focus2004 的文章
posted on 2005-08-12 15:39
Rosen
閱讀(8652)
評論(15)
編輯
收藏
所屬分類:
Java EE 服務器端
評論
#
re: 精確截取字符串(轉載)
2005-08-19 08:27
ivan
if(b<0) 編譯會出錯。
回復
更多評論
#
re: 精確截取字符串(轉載)
2005-08-19 20:39
Rosen
馬上修改一下代碼,去年轉貼的時候一直忘記修改了。
是 if(b[i] < 0),謝謝 ivan 指正。
回復
更多評論
#
re: 精確截取字符串(轉載)
2006-01-28 18:24
tdg
大作拜讀,有一點愚見,特拋磚引玉:
1。字符串除了可以基于byte[]操作外,還可以基于char[]操作。看老大你的意圖是想截取字符串的前幾個字符然后加上省略符號最后輸出而已,完全不必考慮用byte[]數組操作啊 。而且好像開發中更注重語義上的第幾個字符而不是你說的這種情況哦。
2。以下是拙作,請斧正:
/**
* 字符串截取函數
* @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;
//如果字符串的位數小于等于要截取的位數,附加上表示省略的信息的字符串后返回
if (str.length() <= length) {
return str + symbol;
//從零開始,截取length個字符,附加上表示省略的信息的字符串后返回
} 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;
}
}
回復
更多評論
#
re: 精確截取字符串(轉載)
2006-01-28 20:03
Rosen
呵呵 tdg 兄很認真喔,談不上斧正。主要是這個問題,用 char 處理,如果是字母或者數字,實際上截取出來的會比漢字少占用一半的空間,所以截取出來后,還是不能對齊。而實際上 char 數組中,不管是字母、數字還是漢字,它們都只代表一個單元。但是 byte 則不同,字母、數字只占用一個字節,而漢字占用兩個字節(都是GBK編碼)。
回復
更多評論
#
re: 精確截取字符串(轉載)
2006-03-24 10:49
istarliu
您好!
你的文章讓我受益不少,有個問題想向您確認一下:
在代碼中
b = str.getBytes("GBK");
if(b.length <= len)
return str;
for(int i = 0; i < len; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
是不是如果只要是中文漢字,在b[i]對應的值都是小于0的,
也就是說,在漢字代表的兩個字節中,這兩個漢字分別轉化為整數值時,是不是一定小于0,但值范圍不能小于-127的。做過測試,不能肯定。:)
回復
更多評論
#
re: 精確截取字符串(轉載)
2006-03-30 17:42
Rosen
istarliu,這里要強調一下,GBK、GB2312 雙字節編碼字節才是負的。UTF-8 三字節編碼未去核實。
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-01-19 16:28
lyazure
無意義的做法, 犯了常識錯誤, java內部表示任何字符都是16位, 而且不涉及輸入輸出操作不需要字符解碼編碼操作.不知道文中的"單純地判斷字符數效果并不理想"的結論如何得出,恐怕只是臆斷.事實上只需根據字符數截取即可.
public String getLimitLengthString(String srcString, int expectLength){
if(srcString.length() <= expectLength) return srcString;
return srcString.subString(0, expectLength);
}
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-01-19 23:19
Rosen
@lyazure
我只想說一句,請驗證后再回答,最好能打印在 html 頁面中,然后混合漢字和數字輸出,看看長短是否一致。
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-01-20 07:08
lyazure
不知Rosen驗證原文中代碼用的是怎樣的例子,能否可以提供一個我不能處理的字符串或者這樣的情境?
從文中的涉及對字符解碼操作來看, 接收到的參數字符串并未正確解碼, 關鍵不在字符長度處理的問題.只需先對字符串進行正確解碼.
String desString = new String(srcString.getBytes("ISO-8859-1"), "GBK");
之后所有字符操作都可以正常進行,不會出現字符長度問題.
另外,從文中的意義看來, 原文對字符的解碼應當用ISO-8859-1,而不是GBK,當然,因為GBK向下兼容ISO-8859-1,因此從結果來說并沒有問題.
之前的評論有些詞語過激,希望Rosen不要往心里去. 但似乎Rosen的回答馬上有針鋒相對的味道,呵呵.希望是我多慮了.
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-01-20 14:07
Rosen
@lyazure
還不是很激動,只是感覺本文的意思沒有完全表達清楚,應該再加點描述,比如這樣的例子:
字符串“中文中文2222”,當直接截取srcString.substring(0, 4)時,“中文中文”這四個字會正確打印出來,沒錯。不過如果我們把字符串改為“2222中文中文”,那么打印出來的應該是“2222”。
這個時候輸出到 html 是這樣的:
中文中文
2222
可以看到,雖然我都是截取的同樣長度,但是頁面卻很不美觀,長短不一,一個現實中的例子,當然也是我一直沒有糾正過來的錯誤,
http://www.cdcin.com
,你看首頁的“新聞信息”欄目,當出現標題有數字的情況時,就顯得很不統一,參差不齊。
所以,這就是本文為什么要討論按照編碼規則來截取字符串的原因。當然,這樣處理并不會徹底的解決不整齊,但是總會好些,比如哪天發布某條全是數字和字母的標題,那這種參差不齊就太嚴重了。
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-01-20 18:38
lyazure
看來我理解錯了,原來是為了獲得一致的顯示寬度.
回復
更多評論
#
我的做法
2007-04-24 15:16
國家機器
/***
* 字符串的單個字符是否是漢字
* @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個字符
* 此處著重處理了英文字符和中文字符在顯示上的一致性;
* 2個英文字符和一個漢字占據的寬度一致;
*/
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 "";
}
回復
更多評論
#
re: 精確截取字符串(轉載)
2007-05-14 11:44
Rosen
@國家機器
呵呵,感謝貢獻,你的做法更精確了。
回復
更多評論
#
re: 精確截取字符串(轉載)
2016-08-18 17:22
JustPassoner
@國家機器
六六,認識你是我等榮幸,酒瘋知己千杯燒...
回復
更多評論
#
re: 精確截取字符串(轉載)
2016-08-18 17:56
JustPassoner
string=goodStr(string); 這個方法 是干什么用處的?
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Servlet的異步轉同步調用
利用 iText 實現 PDF 報表下載
OSGi起步(OSGi for Beginners)
Java 生成 JPG 縮略圖
Apache FileUpload 上傳以及 JExcelApi 解析
JBI-Java 實現 SOA 的標準途徑(翻譯)
與 Axis 1.x 同行
BIRT 總覽(翻譯)
XML 的 RUD
四種 XML 解析技術之不完全測試
Powered by:
BlogJava
Copyright © Rosen
主站蜘蛛池模板:
免费看又黄又爽又猛的视频软件
|
亚洲天堂免费在线
|
亚洲精品黄色视频在线观看免费资源
|
亚洲精品欧洲精品
|
曰批全过程免费视频网址
|
91亚洲国产成人精品下载
|
1000部免费啪啪十八未年禁止观看
|
精品亚洲综合在线第一区
|
特级精品毛片免费观看
|
91亚洲国产在人线播放午夜
|
国产精品成人免费福利
|
亚洲最大av资源站无码av网址
|
成年女人看片免费视频播放器
|
亚洲色大成WWW亚洲女子
|
国产成人精品高清免费
|
一级黄色免费大片
|
亚洲av无码乱码国产精品fc2
|
免费A级毛片无码A∨
|
亚洲AV无码乱码在线观看代蜜桃
|
美女被cao免费看在线看网站
|
亚洲一久久久久久久久
|
亚洲AV无码一区二区三区在线观看
|
99国产精品免费观看视频
|
亚洲综合久久一本伊伊区
|
国产免费一区二区三区VR
|
中文字幕手机在线免费看电影
|
亚洲专区中文字幕
|
国产精品免费综合一区视频
|
高清免费久久午夜精品
|
久久精品国产亚洲av成人
|
男女做羞羞的事视频免费观看无遮挡
|
亚洲另类无码专区丝袜
|
国产精品亚洲αv天堂无码
|
91香蕉在线观看免费高清
|
亚洲日韩一区精品射精
|
综合亚洲伊人午夜网
|
久久成人国产精品免费软件
|
亚洲av日韩av永久在线观看
|
在线A亚洲老鸭窝天堂
|
台湾一级毛片永久免费
|
在线视频网址免费播放
|