• 带中文的字符串截取


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

    当然,可以用高超的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;
    };

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

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

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

  • 相关阅读:
    【HBase】+Java+批量增查数据
    【jmeter】+基础功能介绍
    【jmeter】+安装配置
    【IDEA】+激活
    【IDEA】+把A工程导入B工程中,A使用B中的类
    【Java】+字符中的字符替换
    【IDEA】+ 代码折叠与展开
    【Java】+获取当前方法名 or 类名
    【IDEA】+把自己做的小工具jar包上传到官方Maven仓库
    【IDEA】+将一个项目打成一个jar包,并在另一个项目中用这个jar包中的类(测试模块里的类没法用)
  • 原文地址:https://www.cnblogs.com/qiaoge0923/p/10000277.html
Copyright © 2020-2023  润新知