字符串(字节)长度计算

这篇具有很好参考价值的文章主要介绍了字符串(字节)长度计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前置知识

字节

字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。

  • 一个字节(byte)8位(bit),十进制表示0~255。
  • 两个字节16位,可表示十进制0~65535。

Unicode字符集

Unicode 做了一件事,就是给世界上所有字符都分配了一个唯一的数字编号,这个编号范围从0x000000~0x10FFFF,包括110多万。但大部分常用字符都在0x0000~0xFFFF之间,即65536个数字之内。每个字符都有一个Unicode编号,这个编号一般写成十六进制,在前面加U+。编号怎么对应到二进制表示呢?有多种方案,主要有UTF-32、UTF-16和UTF-8。

JavaScript 使用 Unicode 字符集,采用 UTF-16 编码方案(整合UCS-2编码。一开始JavaScript采用的是UCS-2,那时候Unicode的UTF-16标准还没发布)。UTF-16兼容ASCII,即前128个Unicode代码点是ASCII字符编码的直接匹配。


各字符集中汉字所占字节

  • ASCii字符集:只有英文、数字、符号等,占1个字节。
  • GBK字符集:汉字占2个字节,英文、数字占1个字节。
  • UTF-32字符集:汉字占4个字节,英文、数字占2个字节。
  • UTF-8字符集:汉字占3个字节,英文、数字占1个字节。

数据库中字段长度

  • Oracle

    • Oracle中varchar2类型的字段长度单位默认是按照byte(字节)来定义,比如常见写法varchar2(10)代表只接收最大10字节长度。
    • 其实我们在Oracle中也可以用字符为单位来定义varchar2字段的长度,这个时候需要注意在建表时写成VARCHAR2(10 char)。
  • MySql

    • 5.X 以上的版本的定义中表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符。
    • 4.X 的版本表示的是字节长度,会根据字符集转变内容字节长度存储。
  • 使用oracle数据库或mysql4.x数据库,就需要注意所提交字符(串)的字节长度。


方法charCodeAt

charCodeAt()方法返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元(小知识:2的16次方等于65536)。

有些网友说返回的是十六进制的整数,我们可以进行如下测试验证一下:

var str = "编码"
console.log('测试数据 = '+ str.charAt(0))
console.log('------------------- ')
console.log('情况一:charCodeAt返回的是16进制的unicode编码')
//十六进制
var code16 = str.charCodeAt(0)
console.log('十六进制编码 = '+ code16)
// 使用eval(),将十六进制的unicode编码转换为字符
var res = eval("'\\u" + code16 + "'")
console.log('恢复成字符 = '+ res+ ";测试"+(res == str.charAt(0)?"通过✅":"不通过❌"))
console.log('------------------- ')

console.log('情况一:charCodeAt返回的是10进制的unicode编码')
//十进制
var code10 = str.charCodeAt(0)
console.log('十进制编码 = '+ code10)
console.log('十六进制编码 = '+ code10.toString(16))
// 使用eval(),将十六进制的unicode编码转换为字符
var res2 = eval("'\\u" + code10.toString(16) + "'")
console.log('恢复成字符 = '+ res2+ ";测试"+(res2 == str.charAt(0)?"通过✅":"不通过❌"))
console.log('------------------- ')


测试数据 =------------------- 
情况一:charCodeAt返回的是16进制的unicode编码
十六进制编码 = 32534
恢复成字符 =4;测试不通过❌
------------------- 
情况一:charCodeAt返回的是10进制的unicode编码
十进制编码 = 32534
十六进制编码 = 7f16
恢复成字符 = 编;测试通过✅
------------------- 

测试结果表明,返回的是十进制的整数。


字符串(字节)长度计算

需求:前端向后端提交数据,数据库字段限制了长度,一般单位是字节,中英文字符所占字节数是不一样的。所以对于中英文混合的数据不能直接使用字符串的length属性来获取长度(字符个数)。


思路

  • 要明确后端数据库所采用的字符集,再计算数据提交到数据库后实际所占的字节长度(是否符合数据库字段所限制长度)。
  • 使用方法charCodeAt(),获取字符的unicode编码(0 到 65535 之间的整数)。
  • 常见英文字母、英文标点符号(半角符号),unicode编码小于128(0~127。1字节可表示0~255),即ASCII编码。
  • 判断方法charCodeAt()返回的整数是否大于255(0开始),若大于则认为是汉字字符。也有网友通过判断unicode编码是否大于127作为分界。
/**
 * 获取字节长度。
 * ASCii字符集:只有英文、数字、符号等,占1个字节。
 * GBK字符集:汉字占2个字节,英文、数字占1个字节。
 * UTF-32字符集:汉字占4个字节,英文、数字占2个字节。
 * UTF-8字符集:汉字占3个字节,英文、数字占1个字节。
 */
function getByteLen(value, charset) {
	var charlen = 2; //默认 1个汉字占2字节
	if (!charset) {
		charset = 'gbk'; //默认为gbk(数据库中最常用的字符集是utf-8、gbk)
	}
	if ((charset + "").toLowerCase().indexOf('gb') == 0) { //GB2312、GBK、GB18030
		charlen = 2;
	}
	if ((charset + "").toLowerCase() == 'utf-8') {
		charlen = 3;
	}
	if ((charset + "").toLowerCase() == 'utf-32') {
		charlen = 4;
	}
	if (value == null || value.length < 1) return 0;
	var len = 0;
	for (var i = 0; i < value.length; i++) {
		if (value.charCodeAt(i) < 255) {
			len++;
		} else {
			len += charlen;

		}
	}
	return len;
}

示例:

console.log(getByteLen('ab我', 'utf-8')); //5
console.log(getByteLen('ab我', 'gbk')); //4
console.log(getByteLen('ab我')); //4

扩展

实现字符与unicode编码互转,见这篇博客。


参考:CSDN、脚本之家、百度百科、《Java编程的逻辑》-马俊昌文章来源地址https://www.toymoban.com/news/detail-448479.html

到了这里,关于字符串(字节)长度计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算字符串长度的三种方法(库函数 指针 )【详解】

    求字符串长度简单来说就是计算一个字符串(字符数组)中元素的个数即从数组头部计数,直到遇到字符串’\\0’结束符为止, 计数结果不包括’\\0’. C语言中的库函数strlen,它包含于string.h中,因此我们需要在使用前添加头文件 ,具体用法如下: strlen从数组头部计数,直到遇到字

    2024年02月06日
    浏览(60)
  • 计算字符串的长度几种方法 | 递归 | 指针减指针 | 计数器 | C语言 | 详解 | 期末考试必看!!!

    1,题目描述 2,分析题目 Ⅰ,题目中要求 除了函数的形参,函数中不能够使用多余的变量 (这是比较 苛刻 的要求)。 Ⅱ,根据此,很自然的想到需要使用 递归 来解决问题。 Ⅲ, 字符串的结束标志是\\\'\\0\\\',因此可以将 读取到\\\'\\0\\\' 作为结束条件 3,关于递归的基本知识 Ⅰ,递

    2024年02月03日
    浏览(39)
  • Linux中获取字符串长度与获取子字符串

    一、  获取字符串长度 #!/bin/bash string = \\\"jobs\\\" echo   ${string}      # 输出结果: jobs echo   ${#string}     # 输出结果: 4 二、 提取子字符串 以下实例从字符串第 2  个字符开始截取 4  个字符: #!/bin/bash str = \\\"敢于亮剑决不后退\\\" echo   ${str:2:2}      # 输出结果为: 亮剑 ​​​​​

    2024年02月19日
    浏览(35)
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

    分析:    在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。   在主函数 main 中,定义一个大小为 20 的字符数组 a,用于存储输入的字符串。然

    2024年01月21日
    浏览(48)
  • C/C++字符函数和字符串函数详解————长度受限制的字符串函数

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言         2.长度受限制的字符串函数 2.1strncpy函数 2.2strncat函数 2.3strncmp函数

    2024年02月08日
    浏览(31)
  • 字符串后面补最短长度的字符,使其整体成回文字符串(java)

    给定一个字符串str,只能在str的后面添加字符,想让str整体变成回文串,返回至少要添加几个字符 首先介绍下manacher 算法: Manacher 算法是一种线性时间复杂度的求解最长回文子串的算法。它的核心思想是利用已知回文信息,避免重复计算。 Manacher 算法的基本思想是通过预处

    2024年02月16日
    浏览(27)
  • C和指针(六)字符串、字符、字节

    字符串 1,C没有显式的字符串类型,以字符串常量形式出现,存储于字符数组中。 2,C字符串是一串以NUL字节结尾的字符。 1)字符内部不能出现NUL字节。 2)NUL字节是字符串的终止符,不是字符串的一部分,所以字符串长度不包括NUL字节。 3,头文件string.h包含了使用字符串

    2024年02月10日
    浏览(32)
  • 【Python系列】获取字符串的长度

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年04月09日
    浏览(36)
  • Java如何求得字符串的长度

    在 Java 中,要获取字符串的长度,可以使用 String 类的 length() 方法 其语法格式: 字符串名.length(); 返回的值是int类型的长度值。 举例: 1.例如现在接收到了一串字符串,可能接收到的是正常的字符串,也有可能是空字符串,这时候就需要判断下字符串是否存在值,就可以使

    2024年02月16日
    浏览(31)
  • LeetCode——最小化字符串长度

    目录 一、题目 二、题目解读  三、代码  1、set去重 2、用一个二进制数记录每个字母是否出现过 6462. 最小化字符串长度 - 力扣(Leetcode) 给你一个下标从  0  开始的字符串  s  ,重复执行下述操作  任意  次: 在字符串中选出一个下标  i  ,并使  c  为字符串下标  i

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包