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 lgs 11 { 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 /// <summary> 36 /// 方式一:实现汉字按照字节数截取,对于不是偶数的字节数,会解析为 ? 37 /// </summary> 38 /// <param name="originStr">原字符串</param> 39 /// <param name="startIndex">开始截取的索引</param> 40 /// <param name="length">需要截取的字节数</param> 41 /// <returns></returns> 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加1 60 } 61 else 62 { 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 else 80 { 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