当前位置: 移动技术网 > IT编程>开发语言>c# > C#(.net)中按字节数截取字符串最后出现乱码问题的解决

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

前言

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

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代码是不是比较简洁?

总结

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网