【原創】向C#的String類新增按位元組擷取字串的擴充套件方法
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 = System.Text.Encoding.Unicode.GetBytes(s);
然後從第一個位元組開始掃描,對於一個英文或數字字元,UCS2編碼的第一個位元組是相應的ASCII,第二個位元組是0,如a的UCS2編碼是97
0,而漢字兩個位元組都不為0,因此,可以利於UCS2編碼的這個規則來計算實際的位元組數,為了更方便,將按位元組長度擷取字串的方法註冊為String類
的擴充套件方法,實現程式碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static class StringExt
{
public static String bSubstring(this string s, int length)
{
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(s);
int n = 0; // 表示當前的位元組數
int i = 0; // 要擷取的位元組數
for (; i < bytes.GetLength(0) && n < length; i++)
{
// 偶數位置,如0、2、4等,為UCS2編碼中兩個位元組的第一個位元組
{
n++; // 在UCS2第一個位元組時n加1
}
else
{
// 當UCS2編碼的第二個位元組大於0時,該UCS2字元為漢字,一個漢字算兩個位元組
{
n++;
}
}
}
// 如果i為奇數時,處理成偶數
if (i % 2 == 1) {
// 該UCS2字元是漢字時,去掉這個截一半的漢字
if (bytes[i] > 0)i = i - 1;
// 該UCS2字元是字母或數字,則保留該字元
i = i + 1;
}
return System.Text.Encoding.Unicode.GetString(bytes, 0, i);
}
}
在上面的程式碼中,如果最後要擷取奇數個字元(以位元組為單位),並且當最後一個字元是字母或數字,則保留該字元,如果是漢字,說明這個漢字被截了一半,則去掉這個漢字。
可以使用下面的程式碼來擷取字串:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->String subStr = s.bSubstring(6); // substr的值是"a加b等"
關於擴充套件方法的詳細講解,請讀者參閱《.net framework3.5新特性2:var、初始化、匿名類和擴充套件方法 》一文。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-444244/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】用Java實現按位元組長度擷取字串的方法Java字串
- C#中如何按位元組數擷取字串?C#字串
- 網頁重寫字串val()方法的擴充套件獲取安全引數String網頁字串套件
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- Java String類,字串常量池,建立方法,字串的獲取,擷取,轉換,分割。Java字串
- C#中的擴充套件類的理解C#套件
- JavaScript String 物件擴充套件方法JavaScript物件套件
- C#新特性:匿名類和擴充套件方法C#套件
- 04.字串的擴充套件字串套件
- 關於給apache新增PHP擴充套件的方法ApachePHP套件
- .NET: 談談C#中的擴充套件方法C#套件
- Java 中模擬 C# 的擴充套件方法JavaC#套件
- C#基礎系列:擴充套件方法的使用C#套件
- ES6 -- String 擴充套件方法解析套件
- C#中的this擴充套件方法與javascript中的prototype方法C#套件JavaScript
- 【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法C#隨機套件
- 新增php擴充套件PHP套件
- es6 字串的擴充套件字串套件
- ES6物件的擴充套件及新增方法。物件套件
- 新增php的memcached擴充套件模組PHP套件
- 擴充理解位元組序
- C#|.net core 基礎 - 擴充套件陣列新增刪除效能最好的方法C#套件陣列
- C# 反射呼叫擴充類方法C#反射
- 轉向Kotlin——列舉類和擴充套件Kotlin套件
- Node v4 – 字串的擴充套件字串套件
- 分類擴充套件套件
- 【原創】.net framework3.5新特性2:var、初始化、匿名類和擴充套件方法Framework套件
- weex ios擴充套件類的作用iOS套件
- String擴充套件trim方法,刪除前後空格套件
- Scale-up(縱向擴充套件)和Scale-out(橫向擴充套件)套件
- Monitor的擴充套件支援string的超時鎖套件
- C#常用字串擷取C#字串
- C#學習筆記(補充)——擴充套件方法、事件C#筆記套件事件
- 負載均衡的原理(垂直擴充套件 Scale Up、橫向擴充套件 Scale Out)負載套件
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- c# 高階應用 理解擴充套件方法C#套件
- C# Enum列舉型別操作擴充套件類C#型別套件
- es6-字串擴充套件字串套件