1 using System; 2 using System.Collections.Generic; 3 using System.Collections; 4 using System.IO; 5 using System.Security.Cryptography; 6 using System.Text; 7 8 namespace myMethod 9 {10 class lgs11 {12 static void Main()13 {14 15 string str = "实现汉字按照";16 17 //Console.WriteLine(str.Substring(0, 3));18 19 //Console.WriteLine(SubStringByte(str, 0, 5));20 21 Console.WriteLine(CutSubstring(str, 3));22 23 //byte[] bytes = Encoding.Unicode.GetBytes(str);24 25 //for (int i = 0,iMax = bytes.Length; i < iMax; i++)26 //{27 // Console.WriteLine(bytes[i]);28 //}29 30 Console.ReadKey();31 }32 33 static Encoding encoding = Encoding.GetEncoding("GB2312");34 35 ///36 /// 方式一:实现汉字按照字节数截取,对于不是偶数的字节数,会解析为 ?37 /// 38 /// 原字符串39 /// 开始截取的索引40 /// 需要截取的字节数41 ///42 static string SubStringByte(string originStr, int startIndex, int length)43 {44 byte[] byteArray = encoding.GetBytes(originStr);45 return encoding.GetString(byteArray, startIndex, length);46 }47 48 static string CutSubstring(string s, int length)49 {50 byte[] bytes = Encoding.Unicode.GetBytes(s);51 int n = 0; // 表示当前的字节数52 int i = 0; // 要截取的字节数53 int rank = bytes.GetLength(0); // 第0维数组元素的个数54 for (; i < rank && n < length; ++i)55 {56 // 偶数位置,如0、2、4等,为UCS2编码(即两个字节代表一个汉字的汉字编码格式)中两个字节的第一个字节57 if (i % 2 == 0)58 {59 n++; // 在UCS2第一个字节时n加160 }61 else62 {63 // 当UCS2编码的第二个字节大于0时,该UCS2字符为汉字,一个汉字算两个字节64 if (bytes[i] > 0)65 {66 n++;67 }68 }69 }70 // 如果i为奇数时,处理成偶数71 if (i % 2 == 1)72 {73 // 该UCS2字符是汉字时,去掉这个截一半的汉字74 if (bytes[i] > 0)75 {76 i = i - 1;77 }78 // 该UCS2字符是字母或数字,则保留该字符79 else80 {81 i = i + 1;82 }83 }84 return Encoding.Unicode.GetString(bytes, 0, i);85 }86 }87 }
参考:http://www.xuejiehome.com/blread-1620.html
注意理解:
如果对字符编码不理解,请看:
https://www.cnblogs.com/luguoshuai/p/10005630.html
https://www.cnblogs.com/luguoshuai/p/10005660.html
https://www.cnblogs.com/luguoshuai/p/10005826.html