最新消息:发现真没时间折腾VPS,最近又换了个空间。呵呵

用Javascript取得字符串的UTF8编码的Byte数

有时候开发系统时,Oracle数据库里用的是Varchar2而不是NVarchar2,保存的编码是UTF-8,这时候对于画面的输入就应该做长度验证。但UTF-8是变长编码。比如定义一个120位的Varchar2,它可以存120个英文字母,60个拉丁文字,40个常用的中文文字,30个非常用的中文文字。这时候就需要用JavaScript取得输入字符串UTF-8编码下的Byte数。其方法有很多,只摘录以下几个。

方法一:
原理:用encodeURIComponent函数把字符串转化为URL字符串,然后用unescape转化回来(unescape会把所有URL字符串里的字符转化字符,它是单字符转转的)。但现在ECMAScript v3 已从标准中删除了 unescape() 函数,以后的浏览器可能会不支持。代码如下:

JavaScript
var utf8Length = unescape(encodeURIComponent(utf8text)).length;

方法二:
用的还是方法一的原理,不过不用unescape,只用encodeURIComponent。它的原理是把编码好的URL里的%xx替换成字符U,然后再计算长度。其代码如下:

JavaScript
var utf8Length = encodeURIComponent(text).replace(/%[A-Fd]{2}/ig, 'U').length;

方法三:
不用内部方法,而是直接用字符串里字符的编码(CharCode)来计算长度。这种方法相对通用,它几乎可以计算所以编码的长度(只要你知道编码规则)。JavaScript内部用的是UTF-16的编码方式,但是对于字符串的长度计算好像有些问题(参考文章:http://yutuo.net/archives/d23393452170e7b9.html)。其代码如下:

JavaScript
function getUtf8Length(s) {
    var len = 0;
    for (var i = 0; i < s.length; i++) {
        var code = s.charCodeAt(i);
        if (code <= 0x7f) {
            len += 1;
        } else if (code <= 0x7ff) {
            len += 2;
        } else if (code >= 0xd800 && code <= 0xdfff) {
            len += 4; i++;
        } else {
            len += 3;
        }
    }
    return len;
}
var utf8Length = getUtf8Length(utf8text);

其它:
对于需要知道字符Unicode的人,可以用以下代码来取得字符的Unicode

JavaScript
function fixedCharCodeAt(str, idx) {
    idx = idx || 0;
    var code = str.charCodeAt(idx);
    var hi, low;
    if (0xD800 <= code && code <= 0xDBFF) {
        hi = code;
        low = str.charCodeAt(idx + 1);
        if (isNaN(low)) {
            throw 'String is error';
        }
        return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
    }
    if (0xDC00 <= code && code <= 0xDFFF) {
        return false;
    }
    return code;
}
var unicodeValue = fixedCharCodeAt(str, 0);

参考地址:http://stackoverflow.com/questions/2848462/count-bytes-in-textarea-using-javascript

转载请注明:宇托的狗窝 » 用Javascript取得字符串的UTF8编码的Byte数

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址