今天要截取一個文檔,發現C#中substring默認是將漢字當一個字節來截取的,但是我需要把漢字按照2個字節來算。
比如:
str="雪潔hello"
我想要前5個字節的字符,也就是"雪潔h"。
如何處理?
C#中substring默認是將漢字當一個字節來截取的,那么如何按字節數截取字符串?
答案:
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { String str = "雪潔之家,xuejie's blog,你好,hello"; TextBox1.Text = str.Substring(0, 8); TextBox2.Text = SubstringByte(str, 0, 8); TextBox3.Text = cutSubstring(str, 8); TextBox4.Text = SubstringByte(str, 0, 3); TextBox5.Text = cutSubstring(str, 3); } private static Encoding _encoding = System.Text.Encoding.GetEncoding("GB2312"); //第一種方法 private string SubstringByte(string text, int startIndex, int length) { byte[] bytes = _encoding.GetBytes(text); return _encoding.GetString(bytes, startIndex, length); } //第二種方法 private string cutSubstring(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編碼中兩個字節的第一個字節 if (i % 2 == 0) { n++; // 在UCS2第一個字節時n加1 } else { // 當UCS2編碼的第二個字節大於0時,該UCS2字符為漢字,一個漢字算兩個字節 if (bytes[i] > 0) { n++; } } } // 如果i為奇數時,處理成偶數 if (i % 2 == 1) { // 該UCS2字符是漢字時,去掉這個截一半的漢字 if (bytes[i] > 0) i = i - 1; // 該UCS2字符是字母或數字,則保留該字符 else i = i + 1; } return System.Text.Encoding.Unicode.GetString(bytes, 0, i); } }
來源:https://www.cnblogs.com/xuejie/archive/2012/12/14/2818452.html