【原創】用Java實現按位元組長度擷取字串的方法
本文為原創,如需轉載,請註明作者和出處,謝謝!
Web應用程式在瀏覽器中顯示字串時,由於顯示長度的限制,常常需要將字串擷取後再進行顯示。但目前很多流行的語言,如C#、Java內部採用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字元都是兩個字元,因此,如果要擷取的字串是中、英文、數字混合的,就會產生問題,如下面的字串:
上面的字串既有漢字,又有英文字元和數字。如果要擷取前6個位元組的字元,應該是”a加b等",但如果用substring方法擷取前6個字元就成了"a 加b等於c"。產生這個問題的原因是將substring方法將雙位元組的漢字當成一個位元組的字元(UCS2字元)處理了。 要解決這個問題的方法是首先得到該字串的UCS2編碼的位元組陣列,如下面的程式碼如下:
由於上面生成的位元組陣列中前兩個位元組是標誌位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個位元組開始掃描,對於一個英文或數字字元,UCS2編碼的第二個位元組是相應的ASCII,第一個位元組是0,如a的UCS2編碼是0 97,而漢字兩個位元組都不為0,因此,可以利於UCS2編碼的這個規則來計算實際的位元組數,該方法的實現程式碼如下:
下面程式碼使用了bSubstring方法:
上面的程式碼擷取的字串是"a加b等"。
Web應用程式在瀏覽器中顯示字串時,由於顯示長度的限制,常常需要將字串擷取後再進行顯示。但目前很多流行的語言,如C#、Java內部採用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字元都是兩個字元,因此,如果要擷取的字串是中、英文、數字混合的,就會產生問題,如下面的字串:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String s = "a加b等於c,如果a等1、b等於2,那麼c等3";
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String s = "a加b等於c,如果a等1、b等於2,那麼c等3";
上面的字串既有漢字,又有英文字元和數字。如果要擷取前6個位元組的字元,應該是”a加b等",但如果用substring方法擷取前6個字元就成了"a 加b等於c"。產生這個問題的原因是將substring方法將雙位元組的漢字當成一個位元組的字元(UCS2字元)處理了。 要解決這個問題的方法是首先得到該字串的UCS2編碼的位元組陣列,如下面的程式碼如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->byte[] bytes = s.getBytes("Unicode");
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->byte[] bytes = s.getBytes("Unicode");
由於上面生成的位元組陣列中前兩個位元組是標誌位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個位元組開始掃描,對於一個英文或數字字元,UCS2編碼的第二個位元組是相應的ASCII,第一個位元組是0,如a的UCS2編碼是0 97,而漢字兩個位元組都不為0,因此,可以利於UCS2編碼的這個規則來計算實際的位元組數,該方法的實現程式碼如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public static String bSubstring(String s, int length) throws Exception
{
byte[] bytes = s.getBytes("Unicode");
int n = 0; // 表示當前的位元組數
int i = 2; // 要擷取的位元組數,從第3個位元組開始
for (; i < bytes.length && n < length; i++)
{
// 奇數位置,如3、5、7等,為UCS2編碼中兩個位元組的第二個位元組
if (i % 2 == 1)
{
n++; // 在UCS2第二個位元組時n加1
}
else
{
// 當UCS2編碼的第一個位元組不等於0時,該UCS2字元為漢字,一個漢字算兩個位元組
if (bytes[i] != 0)
{
n++;
}
}
}
// 如果i為奇數時,處理成偶數
if (i % 2 == 1)
{
// 該UCS2字元是漢字時,去掉這個截一半的漢字
if (bytes[i - 1] != 0)
i = i - 1;
// 該UCS2字元是字母或數字,則保留該字元
else
i = i + 1;
}
return new String(bytes, 0, i, "Unicode");
}
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> public static String bSubstring(String s, int length) throws Exception
{
byte[] bytes = s.getBytes("Unicode");
int n = 0; // 表示當前的位元組數
int i = 2; // 要擷取的位元組數,從第3個位元組開始
for (; i < bytes.length && n < length; i++)
{
// 奇數位置,如3、5、7等,為UCS2編碼中兩個位元組的第二個位元組
if (i % 2 == 1)
{
n++; // 在UCS2第二個位元組時n加1
}
else
{
// 當UCS2編碼的第一個位元組不等於0時,該UCS2字元為漢字,一個漢字算兩個位元組
if (bytes[i] != 0)
{
n++;
}
}
}
// 如果i為奇數時,處理成偶數
if (i % 2 == 1)
{
// 該UCS2字元是漢字時,去掉這個截一半的漢字
if (bytes[i - 1] != 0)
i = i - 1;
// 該UCS2字元是字母或數字,則保留該字元
else
i = i + 1;
}
return new String(bytes, 0, i, "Unicode");
}
下面程式碼使用了bSubstring方法:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String s = "a加b等於c,如果a等1、b等於2,那麼c等3";
System.out.println(bSubstring(s, 6));
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String s = "a加b等於c,如果a等1、b等於2,那麼c等3";
System.out.println(bSubstring(s, 6));
上面的程式碼擷取的字串是"a加b等"。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-442314/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 擷取 UTF8 編碼字串從首位元組開始指定寬度 (非長度)字串
- JavaScript計算字串位元組長度JavaScript字串
- Java String類,字串常量池,建立方法,字串的獲取,擷取,轉換,分割。Java字串
- 字串擷取字串
- 計算返回單、雙位元組字元混合字串長度字元字串
- JavaScript 擷取字串右邊指定長度字元JavaScript字串字元
- Encoding.Default.GetByteCount(),C# 獲取字串位元組長度EncodingC#字串
- JavaScript 擷取指定長度字串 區分漢字和英文字元JavaScript字串字元
- MySQL 字串函式:字串擷取MySql字串函式
- 得到字串 位元組 長度 中文 兩個字元 英文一個字元字串字元
- 125 列舉實現PHP擷取中文不亂碼的實現方法PHP
- jQuery字串擷取詳解jQuery字串
- /**擷取字串是方法*/字串
- Linux下的字串擷取詳解Linux字串
- Shell中的字串擷取介紹字串
- 按位長度進行字串的分割輸出,長度不足補0字串
- 字串擷取 slice,substr,substring 的區別字串
- AES演算法測試用例程式Java實現(金鑰長度128位元)演算法Java
- php 擷取中英文混合字串PHP字串
- JavaScript 擷取指定指定區間字串JavaScript字串
- shell 使用陣列及字串擷取陣列字串
- C#常用字串擷取C#字串
- Swift 4.0 字串擷取,拼接,字串富文字顯示Swift字串
- Java 圖片裁剪,擷取Java
- JS切割擷取字串方法總結JS字串
- sql常用函式詳解(一)——字串擷取SQL函式字串
- MySQL 字串擷取相關函式總結MySql字串函式
- Javascript之字串擷取函式slice()、substring()、substr()JavaScript字串函式
- 使用 NGINX 和 NGINX Plus 實現智慧高效的位元組範圍快取Nginx快取
- 擷取字串字串
- mysql 擷取指定的兩個字串之間的內容MySql字串
- Simple WPF: WPF 實現按鈕的長按,短按功能
- wasm + ffmpeg實現前端擷取視訊幀功能ASM前端
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- Golang 字串分割,替換和擷取 strings.SplitGolang字串
- Java 位元組碼Java
- 擷取字串的三種方法 substr,slice,substring的區別字串
- JavaScript 擷取字串JavaScript字串
- 從 Java 位元組碼到 ASM 實踐JavaASM