日期:2014-05-16  浏览次数:20467 次

js-字符串长度的验证

今天再一次的遇到了这样一个问题-----关于字符串的字节长度。我想很多表单多会有这样的需求,比如前段我在做baidu输入法官网上传词库和皮肤的时候,因为输入项有字节限制。

?

当然很多网络上早就处理了,今天只是简单地总结记录一下。

?

?

//删除左右两端空格
//不同于$.trim()
function trim(str){
 return str.replace(/(^\s*)|(\s*$)/g, "");
}; 
//计算字符串字节长度
//关于这个去空格的需求具体可以变动
function getByteLength(str){
     var len=0,
           i,
          arr = trim(str).split(""); //如果没有需求就改为arr = str.split("");
     for(i=0;i<arr.length;i++){
          if(arr[i].charCodeAt(0)<299){
               len ++;
         }else{
              len +=2;
        }
    }
  return len;
}

console.log(getByteLength("w的长度是duo少"));  //14
console.log(getByteLength(" w的长度是duo少 "));   //14

?

?

ps:很多有后端学习经验或者数据库经验的人或者对字符集比较有研究的人会提出:汉字不一定是算2个字节,好吧,这边我们只是约定一下,汉字算两个字节?

?

后来写lib库的时候看到tangram是这样处理的

?

?

/*
*getByteLength  get the source byte length in gbk*
*@function*
*@param {String} source*
*@remak {Number}*
*@remark in gbk length more than 127 is thought two byte*
*/
ZYC.string.getByteLength = function(source){
     return String(source).replace(/[^\x00-\xff]/g,"ci").length;   //ci是可以换到 当成2个字节的就行
};
?

?

ps:这个版本是没有去空格的,在编码为gbk的情况下去计算的。

?

这边随便提一下常见的字符集(来源于http://baike.baidu.com/view/1204863.htm)

?

  • ASCII
ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。比较EBCDIC。其中95个字符可以显示。另外33个不可以显示。 标准ASCII码为7位,扩充为8位。

基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。

字母和数字的 ASCII 码的记忆是非常简单的。我们只要记住了一个字母或数字的 ASCII 码(例如记住 A 为 65 , 0 的 ASCII 码为 48 ),知道相应的大小写字母之间差 32 ,就可以推算出其余字母、数字的 ASCII 码。

  • GB2312
GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件都支持GB 2312。GB 2312是一个简体中文字符集,由6763个常用汉字682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。

  • UTF-8
UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。

更多链接:http://www.douban.com/group/topic/6922168/ ? ? ? (学习交流用)

?