zoukankan      html  css  js  c++  java
  • 带中文的字符串截取

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

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

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

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

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

  • 相关阅读:
    linux 虚拟机web服务接入互联网
    golang操作数据库
    开启提示:press esc in 5 seconds to skip 如何操作
    如何将qcow2转为vhd
    统信UOS如何分卷压缩
    统信UOS欧拉版本如何制作启动盘
    UOS输错密码导致长时间锁定怎么办?
    在UOS中使用WPS编辑文件,忘记保存关闭了文件,怎么找回?
    uos server版一开始没有安装桌面,后面客户需要加装DDE桌面如何实现
    uos系统升级时,我不想升级相关软件包,应该如何去做
  • 原文地址:https://www.cnblogs.com/qiaoge0923/p/10000277.html
Copyright © 2011-2022 走看看