带中文的字符串截取

摘要:
在C#中,Substring是最常用的字符串截断函数,但这种截断通常是根据汉字的一个位置来计算的。对于汉字以外的其他汉字的处理,此处不进行特殊处理。Javascript获取字节长度String。原型byteLength=function(){varstr=this,strLen=0;for{strLen+=str.charAt.match?截断部分显示“…”。

最近在页面展示的时候遇到这样的场景,文字有可能超长,却又不允许换行。

当然,可以用高超的css来搞定。但如果你想要让多余的文字用“...”来代替,并且要兼容很多浏览器,这种时候用css也会很头疼吧。

1.C#对中文字符串的截取

与英文字符相比,我们把中文字符按两个占位来计算,对于带中文的字符串截取,要面临两个问题:

1.无法截取半个中文字符;

2.对于除汉字以外的中文字符如何处理,比如:标点符号。

在这之前,可以先看看大神对 UTF-8、UTF-16以及UTF-32区别 的讲解。

接下来,我们先来看一下C#的做法。

在C#中,Substring是最常用的字符串截取函数,但是这种截取通常一个中文字符只按一个位置计算。

比如:

“我是Lenmong杨”

截取5个字符就是:

"我是Len"

但其实,我这里想要的是:

“我是L”

在C#中还有很多办法可以做到,介绍一种最简便的方法,利用 System.Text.Encoding.Default 的 GetBytes 函数和 GetString 函数。

private string SubStrByByte(string str, int start, int length)
{
    int len = length;
    int byteCount = System.Text.Encoding.Default.GetByteCount(str);
    //修改最大长度,防止溢出
    if (len > byteCount)
    {
        len = byteCount;
    }
    var strBytes = System.Text.Encoding.Default.GetBytes(str);
    string substr = System.Text.Encoding.Default.GetString(strBytes, start, len);
    //对于半个中文字符的特殊处理
    if (substr.EndsWith("?"))
    {
        //判断原字符串是否包含问号
        var c = str.Substring(substr.Length - 1, 1);
        if (!c.Equals("?"))
        {
            substr = substr.Substring(0, substr.Length - 1);
        }
    }
    return substr + "...";
}

注:在此,对于第一个问题中描述的情况,做了特殊处理。比如从字符串 “我是Lenmong杨” 中截取 1 个或者 3个字符,在这种情况下,由于一个中文字符占两个位置,但我们不可能截取到半个中文字符,所以截取的结果是 "?"或者 “我?”。无法截取的那个中文被"?"代替。

所以我在最后判断了一下,如果截取结果是以"?"结尾,那么就去掉"?",但如果原字符串本身就有问号(英文),那么做就不去掉问号。

对于除了汉字以外的中文字符的处理,此处未作特殊处理。

网上还有几种其他的办法,不再赘述。

Javascript对于带中文字符串的截取

 获取byte长度

String.prototype.byteLength = function() {
    var str = this,
        strLen = 0;
    for(var i = 0; i < str.length; i++) {
        strLen += str.charAt(i).match(/[^x00-xff]/ig) ? 2 : 1;
    }
    return strLen;
};

截取一定长度

String.prototype.substrByByte = function(start, length) {

    var str = this,
        strLen = str.byteLength(),
        subLen = 0,
        substr = "";
    if(length < 1 || length > strLen) throw new Error("参数不正确");
    for(var i = 0; i < str.length; i++) {
        subLen += str.charAt(i).match(/[^x00-xff]/ig) ? 2 : 1;
        if(length <= subLen) {
            substr = str.slice(0, i + 1) + ((length == strLen) ? "" : "...");
            break;
        }
    }
    return substr;
};

 在截取字符串的时候,不足一个汉字的按一个汉字计算。

被截取的部分显示'...'。

 后半段写的有点匆忙,临时有些事情处理,后面有时间再来更新吧。

免责声明:文章转载自《带中文的字符串截取》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Aircrack-ng无线审计工具使用计算机组成原理 — GPU 图形处理器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

scala对复杂json的处理

本次代码主要侧重为flink stream流解析cannal-json,经过多次实验,发现还是阿里的fastjson较为好用,故在此做记录 将依赖引入 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId&g...

C#从数据库mysql读取数据

usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; u...

Python基础24_正则表达式,re模块,

 一. 正则表达式     正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。     正则表达式由普通字符和元字符组成, 普通字符包含大小写字母, 数字. 在匹配普通字符的时候我们直接写就可以了  ...

C# oracle 参数传递的多种方式 留着复习

ORA-01036 非法的变量名/编号,(解决) 博客分类:oracle SQL 下边的代码就会造成 ORA-01036 非法的变量名/编号 C#代码 cmd.CommandText="SELECT*FROMkk.kkyhWHEREid=@comboBox1andpassword=@textBox1"; cmd.Parameters.Add(...

Android之Realm详解(非原创)

文章大纲 一、Realm介绍二、Realm实战三、Realm官方文档四、项目源码下载五、参考文章 一、Realm介绍 1. 什么是Realm   Realm 是一个手机数据库,是用来替代 SQlite 的解决方案,比 SQlite 更轻量级,速度更快,因为它有一套自己的数据库搜索引擎,并且还具有很多现代数据库的优点,支持 JSON,流式 API 调用,数...

Flink--将表转换为DataStream或DataSet

A Table可以转换成a DataStream或DataSet。通过这种方式,可以在Table API或SQL查询的结果上运行自定义的DataStream或DataSet程序 将表转换为DataStream 有两种模式可以将 Table转换为DataStream: 1:Append Mode 将一个表附加到流上 2:Retract Mode 将表转换为流...