JS实现:计算字符串的字节数(UTF8编码)

2种常用方法

以下2种方法,只针对UTF-8编码,详细原因 请见后文的 关于编码。

// 方法1
function calculateUtf8ByteSize(str) {// 非字符串 不作计算if (typeof str !== 'string') return;// 定义变量,用于累加字节数let byteCount = 0;// 遍历字符串中的每个字符for (let i = 0, len = str.length; i < len; i++) {// 获取当前字符的Unicode码const charCode = str.charCodeAt(i);// 根据字符的Unicode码,计算其占用的字节数if (charCode <= 0x007F) {byteCount += 1; // 在000000-00007F之间的字符(如字母),占用1个字节} else if (charCode <= 0x07FF) {byteCount += 2; // 在000080-0007FF之间的字符(如中文),占用2个字节} else if (charCode <= 0xFFFF) {byteCount += 3; // 000800-00FFFF之间的字符(如中文),占用3个字节} else if (charCode <= 0x10FFFF){byteCount += 4; // 010000-10FFFF之间的字符(如表情),占用4个字节} else {console.log('该字符超出Unicode编码范围');}}return byteCount;
}
// 方法2
function calculateUtf8ByteSize(str) {// 非字符串 不作计算if (typeof str !== 'string') return;// 创建一个TextEncoder实例const encoder = new TextEncoder();// 将字符串转换为UTF8编码的字节流(即Uint8Array数据)const utf8 = encoder.encode(str);return utf8.length;
}

 注意:方法2代码量虽少,但其中的TextEncoder,在低版本浏览器可能存在兼容问题。

关于编码

ASCII编码

由美国制定的一套字符集,也是一种编码方式,主要用于英语环境,对应了英文字母、数字、特殊字符和控制字符 等等,它规定1个字符只占用1个字节。

Unicode字符

对应全世界语言符号的一套字符集(且都是唯一的),适用于全球环境(因此也称为万国码),但没有定义 1个字符占用多少字节。

UTF-16编码

一种编码方式,用于将 Unicode字符 编码为可存储的字节。这种编码方式规定,1个Unicode字符占用2或4个字节(绝大多数是2个字节),且无法兼容ASCII码。由于其占用固定的字节数,因此对内存会造成一定的浪费。

UTF-8编码

一种编码方式,用于将 Unicode字符 编码为可存储的字节。这种编码方式规定,1个Unicode字符占用1~4个字节(如上文JS代码所示),可兼容ASCII码。由于其使用更合理的内存分配,因此内存占用比UTF-16更小。

1)字符集 和 编码

Unicode仅仅是一套字符集,并非编码,因为它没有定义 每个字符在计算机中的存储方式(即占用多少字节),而ASCII、UTF-8、UTF-16才算是编码。

2)为何常听说“每个unicode字符占2个字节”

这种说法是不准确的。由于系统前期大多使用UTF-16对Unicode字符进行编码,加上绝大多数情况下的字符只占用2个字符,因此才传出这种说法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Userpycharm 工程设置虚拟venv环境

在 PyCharm 中使用虚拟环境&#xff08;virtual environment&#xff0c;简称 venv&#xff09;非常简单。你可以按照以下步骤在 PyCharm 中配置并使用你的 venv 环境&#xff1a; 1. 打开项目&#xff1a;打开你的项目文件夹&#xff0c;确保你的虚拟环境已经创建在项目文件夹…

golang 协程池 动态扩缩容

参考 github.com/panjf2000/ants package mainimport ("fmt""sync""sync/atomic""time"_ "github.com/panjf2000/ants" )type pool struct {// 协程池最大容量cap int32// 当前运行的协程个数run int32block bool// 空闲…

主流电商平台开放接口:电商数据采集API获取淘宝商品详情描述主图SKU价格订单物流

API接口 返回值说明 item_get-获得淘宝商品详情 API 注册开通 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09…

矩阵链乘法问题

描述 输入 输入共n1行 第一行输入矩阵的总个数n[2,1000] 后n行分别输入矩阵的维数[1,100] 输出 最后一行输出少乘法次数 输入样例 1 6 30 35 35 15 15 5 5 10 10 20 20 25 输出样例1 15125 代码实现 #include<iostream> #include<vector> #include<…

基于ssm的星空游戏购买下载平台的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;商品交易当然也不能排除在外&#xff0c;随着商品交易管理的不断成熟&#xff0c;它彻底改变了过去传统的经营管理方式&#xff0c;不仅使商品…

ES6中 Promise的详细讲解

文章目录 一、介绍状态特点流程 二、用法实例方法then()catchfinally() 构造函数方法all()race()allSettled()resolve()reject() 三、使用场景# 参考文献 一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;…

c++的学习之路:17、stack、queue与priority_queue

摘要 本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现&#xff0c;文章末附上代码以及思维导图。 目录 摘要 一、stack的介绍和使用 1、stack的介绍 2、stack的使用 3、stack的模拟实现 二、queue的介绍和使用 1、queue的介绍 2、queue的使用 3、…

算法训练营第34天|LeetCode 1005.K取反后最大化的数组和 134.加油站 135.分发糖果

LeetCode 1005.K取反后最大化的数组和 题目链接&#xff1a; LeetCode 1005.K取反后最大化的数组和 解题思路&#xff1a; 先处理负数&#xff0c;在处理最小的数。 代码&#xff1a; class Solution { public:int largestSumAfterKNegations(vector<int>& num…

uniapp引入微信小程序版本VantUI,使用VantUI的自定义tabbar,并解决自定义tabbar出现闪烁的情况

视频教程地址&#xff1a;https://www.bilibili.com/video/BV13m41167iG 1.uniapp引入微信小程序版本VantUI 去vant官网下载源码&#xff0c;源码放在github&#xff0c;自行去下载下来 https://vant-contrib.gitee.io/vant-weapp/#/home 在pages.json的globalStyle里面注册组…

php根据用户地址获取经纬度

记录&#xff1a;利用高德地图API&#xff0c;根据用户地址获取经纬度 API文档&#xff1a; https://lbs.amap.com/api/webservice/guide/api/georegeo 调用API代码 <?php /*** 服务器接口类*/ namespace queryAreaInfo;class queryArea{// 根据详细地址获取经纬度publi…

打印月历 Open Judge

题面链接: http://noi.openjudge.cn/ch0113/24/ 题目描述: 评析: 大模拟题&#xff0c;考察的是你的耐心和毅力&#xff01;很不错的模拟题练习题&#xff0c;小白(like me)可以练一练 思路: 先一个月一个月的模拟&#xff0c;求出来题目问的这个一年的这一个月的第一天是星期…

欧盟网络安全局:公共数据空间中的个人数据保护设计(上)

文章目录 前言一、背景:欧盟数据空间(一)欧盟数据空间的设计原则二、欧盟数据空间中数据保护的注意事项(一)欧盟数据空间关键术语(二)数据共享环境中输入隐私和输出隐私问题(三)数据保护工程的作用(四)数据空间中的数据保护影响评估(五)问责制的主要内容(六)通过…

Day30 回溯 LeedCode 332.重新安排行程 51. N皇后 37. 解数独 蓝桥杯 与或异或

332. 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK…

python selenium向html中写入内容

js_kind document.getElementById("returnName1").innerHTML"盾构设备(B010101)" self.Driver.execute_script(js_kind) 通过JS注入HTML代码 如果想输入带html格式的文本可以通过js注入&#xff0c;代码如下&#xff1a; from selenium import webdrive…

Macos 部署自己的privateGpt(2024-0404)

Private Chatgpt 安装指引 https://docs.privategpt.dev/installation/getting-started/installation#base-requirements-to-run-privategpt 下载源码 git clone https://github.com/imartinez/privateGPT cd privateGPT安装软件 安装&#xff1a; Homebrew /bin/bash -c…

java内存模型-DCL

DCL DCL&#xff08;Double-Checked Locking&#xff09;是一种用于实现线程安全的延迟初始化的技术。在Java中&#xff0c;DCL通常用于单例模式的实现。 DCL的基本思想是通过两次检查锁来实现延迟初始化。在第一次检查时&#xff0c;如果对象已经被初始化了&#xff0c;那么…

径流场水土流失自动监测系统的使用

TH-LS1随着环保意识的日益增强&#xff0c;水土流失问题已经成为全球关注的焦点。水土流失不仅破坏了生态环境&#xff0c;还对农业生产、水资源保护等方面产生了严重影响。为了有效监测和控制水土流失&#xff0c;径流场水土流失自动监测系统应运而生。 一、径流场水土流失自…

希尔排序解读

在算法世界中&#xff0c;排序算法是至关重要的一部分。而希尔排序&#xff08;Shell Sort&#xff09;作为一种基于插入排序的改进算法&#xff0c;通过允许交换非相邻元素&#xff0c;从而在一定程度上提高了排序效率。本文将深入探讨希尔排序的原理、实现方式以及它的性能特…

.net 实现的 Webscoket 对象的一些细节和疑问

这两天服务器和客户端进行了webscoket的联调&#xff0c;在和C#的webscoket实现联调的过程中&#xff0c;发现一些有趣的事情。 在我自己C的实现中&#xff0c;webscoket对上层应用而言是完全透明的&#xff0c;webscoket 只是一个传输协议&#xff0c;用户对此不需要有任何关…

Linux C++ 023-类模板

Linux C 023-类模板 本节关键字&#xff1a;Linux、C、类模板 相关库函数&#xff1a;getCapacity、getSize 类模板语法 类模板的作用&#xff1a;建立一个通用的类&#xff0c;类中的成员 数据类型可以不具体制定&#xff0c; 用一个虚拟的类型代表语法&#xff1a; templa…