C#(.net)中按字节数截取字符串最后出现乱码问题的解决
程序员文章站
2023-12-15 09:04:40
前言
最近需要用到按字节数截取字符串。在网上找了很多方法。
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代码是不是比较简洁?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。