JS计算字符长度、字节数

一个汉字在UTF-8编码中占用几个字节?

 

占用3个字节的范围

U+2E80 - U+2EF3 : 0xE2 0xBA 0x80 - 0xE2 0xBB 0xB3 共 115 个
U+2F00 - U+2FD5 : 0xE2 0xBC 0x80 - 0xE2 0xBF 0x95 共 213 个
U+3005 - U+3029 : 0xE3 0x80 0x85 - 0xE3 0x80 0xA9 共 36 个
U+3038 - U+4DB5 : 0xE3 0x80 0xB8 - 0xE4 0xB6 0xB5 共 7549 个
U+4E00 - U+FA6A : 0xE4 0xB8 0x80 - 0xEF 0xA9 0xAA 共 44138 个
U+FA70 - U+FAD9 : 0xEF 0xA9 0xB0 - 0xEF 0xAB 0x99 共 105 个

合计: 52156 个

占用4个字节的范围

U+20000 - U+2FA1D : 0xF0 0xA0 0x80 0x80 - 0xF0 0xAF 0xA8 0x9D 共 64029 个

合计: 64029 个

所以,我认为答案应该是:3个或4个字节

 

//字符编码数值对应的存储长度:     
//UCS-2编码(16进制) UTF-8 字节流(二进制)    
//0000 - 007F       0xxxxxxx (1字节)     
//0080 - 07FF       110xxxxx 10xxxxxx (2字节)     
//0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx (3字节)    
String.prototype.getBytesLength = function() {   
    var totalLength = 0;     
    var charCode;  
    for (var i = 0; i < this.length; i++) {  
        charCode = this.charCodeAt(i);  
        if (charCode < 0x007f)  {     
            totalLength++;     
        } else if ((0x0080 <= charCode) && (charCode <= 0x07ff))  {     
            totalLength += 2;     
        } else if ((0x0800 <= charCode) && (charCode <= 0xffff))  {     
            totalLength += 3;   
        } else{  
            totalLength += 4;   
        }          
    }  
    return totalLength;   
 
var str=",";  
alert("字符数"+str.length+" ,字节数"+str.getBytesLength());    
//Java中的字节数==="字符串".getBytes("UTF-8").length   
  //-->
  

字符长度字节数的关系因字符编码和字符类型而异。 ### 单字节字符情况 在只包含英文字符、数字、特殊字符等单字节字符字符串中,字符长度字节数是一致的。例如英文单词 "hello",其长度为 5,字节数也是 5。因为这些字符在常见编码(如 ASCII)中,每个字符占用 1 个字节的存储空间。 ### 多字节字符情况 当字符串中包含中文、日文、韩文等多字节字符时,字符长度字节数通常不一致。以中文为例,在常见的编码如 UTF - 8 中,一个中文字符通常占用 3 个字节;在 GBK 编码中,一个中文字符占用 2 个字节。 ### 不同编程语言的处理方式 #### JavaScript ```javascript function strlen(str) { var len = 0; for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) { len++; } else { len += 2; } } return len; } ``` 上述代码通过遍历字符串中的每个字符,根据字符的 Unicode 编码范围判断是单字节字符还是多字节字符,从而计算字节数[^1]。 #### Lua ```lua function getStringLength(inputstr) if not inputstr or type(inputstr) ~= "string" or #inputstr <= 0 then return nil end local length = 0 local i = 1 while true do local curByte = string.byte(inputstr, i) local byteCount = 1 if curByte > 239 then byteCount = 4 elseif curByte > 223 then byteCount = 3 elseif curByte > 128 then byteCount = 2 else byteCount = 1 end i = i + byteCount length = length + 1 if i > #inputstr then break end end return length end ``` 该代码通过判断每个字符的字节值范围,确定该字符占用的字节数,进而计算字符串的长度(这里的长度可能指字节数字符数,根据具体需求)[^2]。 #### Java ```java import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; class Main { public static void main(String[] args) throws Exception { String content = "Hello你好世界"; System.out.println(content.length()); byte[] bs = content.getBytes("GBK"); System.out.println(bs.length); Charset charset = Charset.forName("GBK"); ByteBuffer buf = ByteBuffer.wrap(bs); CharBuffer cBuf = charset.decode(buf); System.out.println("String:" + cBuf.toString() + ",length:" + cBuf.toString().length()); } } ``` Java 中可以将字符串转换为字节数组,通过字节数组的长度获取字节数。同时,也可以使用 `Charset` 类进行编码解码操作[^3]。 #### Python ```python str_txt = &#39;测试文本ceshi&#39; cut_bytes = str_txt.encode(&#39;utf-8&#39;) cut_tmp = cut_bytes[:900] cut_res = cut_tmp.decode(&#39;utf-8&#39;, errors=&#39;ignore&#39;) print(&#39;cut_res 长度 字节数&#39;, len(cut_res), len(cut_res.encode())) ``` Python 中可以使用 `encode()` 方法将字符串转换为字节对象,通过字节对象的长度获取字节数;使用 `decode()` 方法将字节对象转换回字符串[^4]。 ### 应用场景 字符长度字节数计算常用于检测描述等长字符串是否超过了指定的长度。例如在数据库中,字段可能有字节数的限制,需要确保插入的字符串不超过该限制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值