平时在作数据库插入操作时,如果用 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; }