zoukankan      html  css  js  c++  java
  • C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错。

    尤其是插入中英文混合字符串时,SQL Server中一般中文要占两个字节,所以对混合型的字符串就要作一个处理,统一按字节长度来计算字符串长度,方法如下:

    C#方法一:

    public static string GetString(string str, int len)
            {
                string result = string.Empty;// 最终返回的结果
                int byteLen = System.Text.Encoding.Default.GetByteCount(str);// 单字节字符长度
                int charLen = str.Length;// 把字符平等对待时的字符串长度
                int byteCount = 0;// 记录读取进度
                int pos = 0;// 记录截取位置
                if (byteLen > len)
                {
                    for (int i = 0; i < charLen; i++)
                    {
                        if (Convert.ToInt32(str.ToCharArray()[i]) > 255)// 按中文字符计算加2
                            byteCount += 2;
                        else// 按英文字符计算加1
                            byteCount += 1;
                        if (byteCount > len)// 超出时只记下上一个有效位置
                        {
                            pos = i;
                            break;
                        }
                        else if (byteCount == len)// 记下当前位置
                        {
                            pos = i + 1;
                            break;
                        }
                    }
    
                    if (pos >= 0)
                        result = str.Substring(0, pos);
                }
                else
                    result = str;
    
                return result;
            }

    C#方法二:推荐

    /// <summary>
            /// 字符串截取函数
            /// </summary>
            /// <param name="inputStr">需要截取的字符串</param>
            /// <param name="length">要截取的长度</param>
            /// <returns></returns>
            public static string SubString(string inputStr,int length) 
            {
                if (string.IsNullOrEmpty(inputStr))
                {
                    return "";
                }
                string temp = inputStr;
                int j = 0, k = 0;
    
                CharEnumerator ce = inputStr.GetEnumerator();
                while (ce.MoveNext())
                {
                    j += (ce.Current > 0 && ce.Current < 255) ? 1 : 2;
    
                    if (j <= length)
                    {
                        k++;
                    }
                    else
                    {
                        temp = inputStr.Substring(0, k);
                        break;
                    }
                }
                return temp;
            }

     JS方法一(推荐):

     function SubString(str, len, hasDot) {
                ///<summary>
                ////显示窗口
                ///</summary>
                ///    <param name="selector" type="String">
                ///        1: str - 源字符串 
    
                ///        2: len - 要截取的长度。
                ///        3: hasDot - 是否显示…。
                ///    </param>
                var newLength = 0;
                var newStr = "";
                var chineseRegex = /[^x00-xff]/g;
                var singleChar = "";
                var strLength = str.replace(chineseRegex, "**").length;
                for (var i = 0; i < strLength; i++) {
                    singleChar = str.charAt(i).toString();
                    if (singleChar.match(chineseRegex) != null) {
                        newLength += 2;
                    }
                    else {
                        newLength++;
                    }
                    if (newLength > len) {
                        break;
                    }
                    newStr += singleChar;
                }
    
                if (hasDot && strLength > len) {
                    newStr += "...";
                }
                return newStr;
            } 

    JS方法二(由C#方法一改写成JS):

    //****************************************************************
    //* 名  称:获取指定字节长度的中英文混合字符串//* 功 能:平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错。
    //         尤其是插入中英文混合字符串时,SQL Server中一般中文要占两个字节,所以对混合型的字符串就要作一个处理,统一按字节长度来计算字符串长度
    //          JS中的几个函数:
    //          charAt(num) //获取字符串的num位置的字符
    //          字符转ascii码:用charCodeAt();
    //          ascii码转字符:用fromCharCode();
    //          示例:
                //<script>
                //str="A";
                //code = str.charCodeAt(); 
                //str2 = String.fromCharCode(code);
                //str3 = String.fromCharCode(0x60+26);
                //document.write(code+'<br />');
                //document.write(str2+'<br />');
                //document.write(str3);
                //</script>
                //输出:
                //65
                //A
                //z
    //* 入口参数:str:需要计算的数据
    //* 出口参数:返回str指定长度len的字符串(双字节(包含中文)长度为2,单字节长度为1)
    //*****************************************************************
    function JsSubString(str, len) {
        var result = ""; // 最终返回的结果
        var chineseRegex = /[^x00-xff]/g;
        var byteLen = str.replace(chineseRegex, "**").length; // 单字节字符长度
        var charLen = str.length; // 把字符平等对待时的字符串长度
                var byteCount = 0;// 记录读取进度
                var pos = 0;// 记录截取位置
                if (byteLen > len)
                {
                    for (var i = 0; i < charLen; i++) {
                        if (str.split("")[i].charCodeAt() > 255)// 按中文字符计算加2
                            byteCount += 2;
                        else// 按英文字符计算加1
                            byteCount += 1;
                        if (byteCount > len)// 超出时只记下上一个有效位置
                        {
                            pos = i;
                            break;
                        }
                        else if (byteCount == len)// 记下当前位置
                        {
                            pos = i + 1;
                            break;
                        }
                    }
    
                    if (pos >= 0)
                        result = str.substring(0, pos);
                }
                else
                    result = str;
    
                return result;
            }
  • 相关阅读:
    java基础(七) java四种访问权限
    java基础(六) switch语句的深入解析
    JavaSe: 不要小看了 Serializable
    对于培训出身的同学,接下来该怎么学习技术?
    Java Tomcat7性能监控与优化详解
    模仿spring-aop的功能,利用注解搭建自己的框架。
    动态页面技术EL
    如何在mysql客户端即mysql提示符下执行操作系统命令
    通过notepad++将混乱的xml配置的格式进行美化
    shell脚本中,for基于列表进行循环的实现方法
  • 原文地址:https://www.cnblogs.com/8090sns/p/SubString.html
Copyright © 2011-2022 走看看