欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#(.net)中按字节数截取字符串最后出现乱码问题的解决

程序员文章站 2024-02-11 22:01:46
前言 最近需要用到按字节数截取字符串。在网上找了很多方法。 encoding.default.getstring采用的default encoding.utf8....

前言

最近需要用到按字节数截取字符串。在网上找了很多方法。

encoding.default.getstring采用的default

encoding.utf8.getbytes采用的是utf-8编码。这样当然是乱码。尤其出现中文时候。

对这类数据处理当然要用统一的编码来处理。下面话不多说了,来一起看看详细的介绍吧

例子:1

 string msg= encoding.utf8.getstring(encoding.utf8.getbytes(strcode)); 

例子:2

string strcode="我是小明";
byte[] buffer=encoding.utf8.getbytes(strcode);
string msg= encoding.utf8.getstring(buffer,0,buffer.length);

实际结果是截取的结尾会出现乱码。原因是最后的字符是多个字节,被不完整的截取了。

改进后的办法如下:

/// <summary>
 /// 按字节数截取字符串的方法(比substring好用)
 /// </summary>
 /// <param name="source">要截取的字符串(可空)</param>
 /// <param name="numberofbytes">要截取的字节数</param>
 /// <param name="encoding">system.text.encoding</param>
 /// <param name="suffix">结果字符串的后缀(超出部分显示为该后缀)</param>
 /// <returns></returns>
 public static string substringbybytes(string source, int numberofbytes, system.text.encoding encoding, string suffix = "...")
 {
  if(string.isnullorwhitespace(source) || source.length == 0)
  return source;

  if(encoding.getbytes(source).length <= numberofbytes)
  return source;

  long templen = 0;
  stringbuilder sb = new stringbuilder();
  foreach(var c in source)
  {
  char[] _chararr = new char[] { c };
  byte[] _charbytes = encoding.getbytes(_chararr);
  if((templen + _charbytes.length) > numberofbytes)
  {
   if(!string.isnullorwhitespace(suffix))
   sb.append(suffix);
   break;
  }
  else
  {
   templen += _charbytes.length;
   sb.append(encoding.getstring(_charbytes));
  }
  }
  return sb.tostring();
 }
 /// <summary>
 /// 按字节数截取字符串的方法(比substring好用)
 /// </summary>
 /// <param name="source">要截取的字符串(可空)</param>
 /// <param name="numberofbytes">要截取的字节数</param>
 /// <param name="encoding">utf-8,unicode,gb2312...</param>
 /// <param name="suffix">结果字符串的后缀(超出部分显示为该后缀)</param>
 /// <returns></returns>
 public static string substringbybytes(string source, int numberofbytes, string encoding = "utf-8", string suffix = "...")
 {
  return substringbybytes(source, numberofbytes, encoding.getencoding(encoding), suffix);
 }

原理很简单,就是截取之前逐个先判断字符是否超出字节长度,如果超出则扔掉整个字符。

在javascript里面的blob对象很容易获取字节长度: var len= new blob(['字符串']).size;

js代码是不是比较简洁?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。