我需要计算使用javascript编码UTF8时textarea的字节长度。知道怎么做吗?
谢谢!
答案 0 :(得分:18)
encodeURIComponent(text).replace(/%[A-F\d]{2}/g, 'U').length
答案 1 :(得分:16)
结合各种答案,以下方法应该快速准确,并避免可能导致encodeURIComponent()错误的无效代理对的问题:
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) {
// Surrogate pair: These take 4 bytes in UTF-8 and 2 chars in UCS-2
// (Assume next char is the other [valid] half and just skip it)
len += 4; i++;
} else if (code < 0xffff) {
len += 3;
} else {
len += 4;
}
}
return len;
}
答案 2 :(得分:14)
编辑:正如didier-l所指出的,此函数不能正确计算代理字符。
broofa的答案应该正确计算代理人,请参阅https://stackoverflow.com/a/12206089/274483。
我在这里测试了两个提议版本以及一个天真的实现:
getUTF8Length: function(string) {
var utf8length = 0;
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utf8length++;
}
else if((c > 127) && (c < 2048)) {
utf8length = utf8length+2;
}
else {
utf8length = utf8length+3;
}
}
return utf8length;
}
结果是我的版本在firefox中稍微快一点,并且chrome(~30x)明显快于此处发布的版本。
答案 3 :(得分:14)
如果你的字符串中有非bmp字符,那就更复杂......
因为javascript执行UTF-16编码,而“字符”是2字节堆栈(16位),所有多字节字符(3个或更多字节)都不起作用:
<script type="text/javascript">
var nonBmpString = "foo€";
console.log( nonBmpString.length );
// will output 5
</script>
字符“€”的长度为3个字节(24位)。 Javascript确实将其解释为2个字符,因为在JS中,字符是16位块。
因此,要正确获取混合字符串的字节大小,我们必须编写自己的函数fixedCharCodeAt();
function fixedCharCodeAt(str, idx) {
idx = idx || 0;
var code = str.charCodeAt(idx);
var hi, low;
if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
hi = code;
low = str.charCodeAt(idx + 1);
if (isNaN(low)) {
throw 'Kein gültiges Schriftzeichen oder Speicherfehler!';
}
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
// We return false to allow loops to skip this iteration since should have already handled high surrogate above in the previous iteration
return false;
/*hi = str.charCodeAt(idx-1);
low = code;
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;*/
}
return code;
}
现在我们可以计算字节数......
function countUtf8(str) {
var result = 0;
for (var n = 0; n < str.length; n++) {
var charCode = fixedCharCodeAt(str, n);
if (typeof charCode === "number") {
if (charCode < 128) {
result = result + 1;
} else if (charCode < 2048) {
result = result + 2;
} else if (charCode < 65536) {
result = result + 3;
} else if (charCode < 2097152) {
result = result + 4;
} else if (charCode < 67108864) {
result = result + 5;
} else {
result = result + 6;
}
}
}
return result;
}
顺便说一下...... 你不应该使用encodeURI方法,因为它是一个本机浏览器函数;)
更多东西:
干杯
frankneff.ch / @frank_neff
答案 4 :(得分:2)
将字节长度计数功能添加到字符串
String.prototype.Blength = function() {
var arr = this.match(/[^\x00-\xff]/ig);
return arr == null ? this.length : this.length + arr.length;
}
然后您可以使用 .Blength()来获取尺寸
答案 5 :(得分:1)
如何简单:
unescape(encodeURIComponent(utf8text)).length
技巧是encodeURIComponent似乎可以处理字符,而unescape可以处理字节。
答案 6 :(得分:0)
我一直在问自己同样的事情。这是我偶然发现的最佳答案:
http://www.inter-locale.com/demos/countBytes.html
以下是代码段:
<script type="text/javascript">
function checkLength() {
var countMe = document.getElementById("someText").value
var escapedStr = encodeURI(countMe)
if (escapedStr.indexOf("%") != -1) {
var count = escapedStr.split("%").length - 1
if (count == 0) count++ //perverse case; can't happen with real UTF-8
var tmp = escapedStr.length - (count * 3)
count = count + tmp
} else {
count = escapedStr.length
}
alert(escapedStr + ": size is " + count)
}
但链接包含一个可以播放的实例。 “encodeURI(STRING)”是这里的构建块,但也请看一下encodeURIComponent(STRING)(已经在上一个答案中指出),看看哪一个符合您的需求。
此致
答案 7 :(得分:0)
encodeURI(text).split(/%..|./).length - 1
答案 8 :(得分:-1)
尝试以下方法:
function b(c) {
var n=0;
for (i=0;i<c.length;i++) {
p = c.charCodeAt(i);
if (p<128) {
n++;
} else if (p<2048) {
n+=2;
} else {
n+=3;
}
}return n;
}
答案 9 :(得分:-1)
设置meta UTF-8
只是&amp;没关系!
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8">
和js:
if($mytext.length > 10){
// its okkk :)
}