字符串按照字节数截取方法总结

时间:2021-08-08 21:19:22
 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