zoukankan      html  css  js  c++  java
  • 字符串按照字节数截取方法总结

     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

  • 相关阅读:
    Linux内核中锁机制之RCU、大内核锁
    Linux内核中锁机制之完成量、互斥量
    Linux内核中锁机制之信号量、读写信号量
    Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁
    Linux内核中锁机制之原子操作、自旋锁
    Linux内核jiffies简介
    pdflush机制
    ext2文件系统
    从ext2文件系统上读出超级块
    ext2磁盘布局
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/10006281.html
Copyright © 2011-2022 走看看