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

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

解决在C#(.net)按字节数截取字符串最后出现乱码的问题的更多相关文章

  1. C#中如何按字节数截取字符串?

    http://www.cnblogs.com/xuejie/archive/2012/12/14/2818452.html

  2. c# 判断字符是否是全角, 获取字符串的字节数 , 获取字符串指定长度字节数的字符串

    1 Encoding.Default.GetByteCount(checkString);  =2 全角 =1 半角 /// <summary> /// 获取字符串的字节长度 /// &l ...

  3. C#按字节长度截取字符串

    产生这个问题的原因是将Substring方法将双字节的汉字当成一个字节的字符(UCS2字符)处理了,导致长度变短. 两个扩展方法按字节长度截取字符串 /// <summary> /// 根 ...

  4. PHP用substr截取字符串出现中文乱码问题用mb_substr

    PHP用substr截取字符串出现中文乱码问题用mb_substr实例:mb_substr('截取中文乱码问题测试',0,5, 'utf-8'); 语法 : string substr (string ...

  5. java根据输入的字符串和字节数来截取,输出对应字节数的字符串

    public class Test { //要进行截取操作的字符串 static String ss; //截取的字符串的字节数 static int n; public static void ma ...

  6. js计算字符串的字节数和字符串与二进制的相互转化

    一.js计算字符串的字节数方法: //blob获取字符串的字节 var debug = "好的"; var blob = new Blob([debug],{type : 'tex ...

  7. php截取字符串,无乱码

    今天面试,有一道题,要求截取中文字符无乱码. 当时因为要赶去另一家去面试,没有仔细分析. 虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的. 回来以后再重新整理了一下. 代码 ...

  8. PHP中使用substr()截取字符串出现中文乱码问题该怎么办

    一.使用mbstring扩展库的mb_substr()截取就不会出现乱码了. 可以用mb_substr()/mb_strcut()这个函数,mb_substr()/mb_strcut()的用法与sub ...

  9. php截取字符串,避免乱码

    转载请注明来源:https://www.cnblogs.com/hookjc/ 1. 截取GB2312中文字符串 <?php//截取中文字符串 function mysubstr($str, $ ...

随机推荐

  1. java的Integer与int的比较

  2. 【Java进阶】并发编程

    PS:整理自极客时间<Java并发编程> 1. 概述 三种性质 可见性:一个线程对共享变量的修改,另一个线程能立刻看到.缓存可导致可见性问题. 原子性:一个或多个CPU执行操作不被中断.线 ...

  3. Exp6 信息搜集与漏洞扫描 20164312 马孝涛

    1.实践内容 (1)各种搜索技巧的应用  (2)DNS IP注册信息的查询  (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的查点(以自己主机为目标)  (4)漏洞扫描:会扫, ...

  4. SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别

    前言: 今天主要的内容是要讲解SQL中关于Join.Inner Join.Left Join.Right Join.Full Join.On. Where区别和用法,不用我说其实前面的这些基本SQL语 ...

  5. 干货|一个案例学会Spring Security 中使用 JWT

    在前后端分离的项目中,登录策略也有不少,不过 JWT 算是目前比较流行的一种解决方案了,本文就和大家来分享一下如何将 Spring Security 和 JWT 结合在一起使用,进而实现前后端分离时的 ...

  6. 机器学习——KMeans聚类,KMeans原理,参数详解

    0.聚类 聚类就是对大量的未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小,聚类属于无监督的学习方法. 1.内在相似性的度量 聚类是根据数据 ...

  7. 【原】使用less实现随机下雪动画

    元旦在公司撸码,想起圣诞节的摇摇乐项目有段代码挺有意思的,借着空闲的时间把代码抽出来,沉淀下经验.冬天来了,设计师说摇摇乐的场景需要随机下落的雪花动画,第一时间就想到的方法是canvas比较好,项目非 ...

  8. ajax请求window.open()被拦截

    项目使用ajax post后根据返回的success,需要打开一个新页面,使用window.open发现谷歌浏览器直接被拦截. 后来了解发现该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了, ...

  9. DRUID连接池配置详情

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  10. svn版本控制迁移到git

    获得原 SVN 仓库使用的作者名字列表 因为导入到git需要配置原作者(svn提交人)和git账户的映射关系 其格式为: vim authors-transform.txt taoxs = xsTao ...