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

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 == )
return source; if(encoding.GetBytes(source).Length <= NumberOfBytes)
return source; long tempLen = ;
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代码是不是比较简洁?

最新文章

  1. Msql:Incorrect double value: &#39;&#39;for column &#39;id&#39; at row 1解决
  2. QEMU中smp,socket,cores,threads几个参数的理解
  3. SECHS
  4. YII获取刚插入数据的id主键
  5. 线性方法用于Binary clssification
  6. struts2的action中获得request response session 对象
  7. Hibernate中Session的几个方法的简单说明
  8. Dropbox 用什么语言开发的?(Python在各个平台都是全能的,特别是有PyObjC真没想到)
  9. 浅谈CSS布局
  10. Android性能优化:谈话Bitmap内存管理和优化
  11. Java 中的四种引用及垃圾回收策略
  12. Java Swing paint repaint update 方法的关系
  13. 深入理解ajax系列第五篇——进度事件
  14. MVC、MVP以及MVVM分析
  15. 人脸检测(1)——HOG特征
  16. JAVA自学作业03
  17. 直接借鉴的 ids拼接
  18. 关于resin的illegal utf8 encoding at (190)解决方式
  19. tarjan,树剖,倍增求lca
  20. Ubuntu 18.04 休眠后无法唤醒的解决办法

热门文章

  1. 关于EffictiveC++笔记
  2. 从壹开始 [Admin] 之四 || NetCore + SignalR 实现日志消息推送
  3. Java ArrayList正确循环添加删除元素方法及分析
  4. 如何在ASP.NET Core中使用Azure Service Bus Queue
  5. java游戏开发杂谈 - 事件处理
  6. AI繁荣下的隐忧——Google Tensorflow安全风险剖析
  7. .Net 反射学习
  8. fab 菜单实现—圆形、半圆、扇形、直线、射线
  9. DataPipeline丨瓜子二手车基于Kafka的结构化数据流
  10. Fiddler-弱网测试设置