热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

逐日30秒⏱字符编码排雷录

简介字符编码、字符长度毛病、截取字符毛病、UTF8、Unicode计算机重重底层之下都是由0和1组合,然则你晓得他们是怎样一步步变成字符串的嘛?在我们实际生活中最罕见的例子能够经由

《逐日 30 秒 ⏱ 字符编码排雷录》

简介

字符编码、字符长度毛病、截取字符毛病、UTF8、Unicode

计算机重重底层之下都是由 0 和 1 组合,然则你晓得他们是怎样一步步变成字符串的嘛?在我们实际生活中最罕见的例子能够经由过程 wo 在新华字典中找到 这个字。一样计算机经由过程 0 和 1 组合在 字典 中查找到对应的字符,那 字典 内容是什么呢?

劈头

计算机降生于 美国 它的运用者大多数运用英文,美国国家标准学会 便制订了这本字典包含了 26个大写英笔墨母26个小写英笔墨母10个阿拉伯数字等统共 256 个字符的 ASCII 字符集。

杂沓

ASCII 用二进制来示意就是 0000 00001111 1111 被用得满满当当,汉字就没有处所能够放得下了这下怎样办?正所谓山河大有人材出,国标编码 GB 系列涌现了,个中最耳熟能详的就是 GB2312

那末题目来了天下具有 25003500 种言语,有笔墨的言语有 930 种。你能设想你在阅读差别言语界面的时刻,须要本身不停的去切换 字典 而且 每次切换查找不到的字符就会乱码涌现。

一致

书同文,车同轨,行同伦。

上面这句话讴歌了秦始王具有跨时期意义的造诣,然则实际天下中一致言语显得不能够。那我们可否换个思绪处置惩罚这个题目呢?先思索一个题目:“把大象放入冰箱须要几步”,答案人人都晓得“翻开,装进去,关上”。那一致字符怎样办呢?那就是建立一个足够大的字典把一切的字符都放进去。

万国码

Unicode 万国码 霹雳一声降生了,望文生义一致了全球的一切笔墨编码能够到 Unicode Consortium 和 codepoints 中检察,对应的完成有UTF8、UTF16
、UTF-32。

可变长度字符编码

UTF8、UTF16、UTF-32最大区分在于对应若干字节的数据,越大能存储的字符也就越多。个中 UTF-8 就是在互联网上运用最广的一种 Unicode 的完成体式格局,也就是如今 html 中最常看到的 所声明字符集。

UTF 最大的特性在于可变长的字节,比方 UTF8 能够是 1到4个字节来纪录 万国码,为何这么设想呢?一样平常运用获得的字符对应的字符编码没有必要占用这么多字节,比方 0000 00000000 0000 0000 0000 都能示意 0,那运用更短的字节所占用的空间更小,传输的速率更快。

小插曲

在一致编码的过程当中还涌现了一个字符集 UCS-2,它牢固运用 2个字节来编码 与 UTF 可变长度字符编码有肯定程度上的差别,然则跟着一致历程下被 UTF-16 收编了。

Javascript 字符处置惩罚

相识字符基本原理和历程后,那末 Javascript 是什么编码呢?没错它就适才 小插曲 中提到的 UCS-2,原因是 Javascript 降生时 UTF-16 还没有涌现。

然则如今人人都在运用 UTF 可变长度字符编码UTF-16 的可变字节为 2个或许 4个,而 UCS-2 却只有 2个。如许两个字符集之间就有存在一个 UCS-2 没法辨认的 4字节,Javascript 在处置惩罚字符时会傻傻的按着 UCS-2 的两字节去处置惩罚,再加上字典里没有这个字符笨笨的小脑袋瓜没法处置惩罚只能输出乱码。

由于 emoji 脸色的提高,而且 emoji 恰好就是处于 UCS-2字典以外,在前端开辟中碰到能够涌现 emoji 的处所须要小心谨慎:

长度

BUG 预警

如今最为经常使用的 emoji 脸色为 4个字节编码示意,由于 UCS-2 牢固两个字节,在统计长度时 emoji 会被当作两个 UCS-2 字符,效果会和我们预期的输出大了一倍。

let emoji = "😊";
// 输出 2
console.log(emoji.length);

BUG 消除

应用 es6 的 Array.prototype.fromspread 来做字符串转数组并计算长度:

let emoji = "😊";
// 输出 1
console.log(Array.from(emoji).length);
// 输出 1
console.log([...emoji].length);

假如不支持 Array.prototype.from 能够应用正则替代把 4字节的字符替代为 _ 并计算长度:

let emoji = "😊";
function countSymbols(string) {
var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
return string
.replace(regexAstralSymbols, '_')
.length;
}
// 输出 1
console.log(countSymbols(emoji));

反转字符串

犹如上面所讲 emoji 会被当作两个 UCS-2 字符,反转的时刻 4个完全的字节会被硬生生的拆分开来,能够运用 Esrever 来处置惩罚。

let emoji = "😊";
// 输出为两个乱码字符
console.log(emoji.split('').reverse().join(''));

字符编码转换

在运用 String.prototype.charCodeAtString.fromCharCode 会涌现题目。能够运用 ES6 的两个新方法来替代 String.prototype.codePointAtString.fromCodePoint

正则婚配

正则里 . 示意婚配一个字符,然则 UTF-16 4字节字符会被当作两个字符来处置惩罚,进而引发毛病。ES6 给出了新的处置惩罚方法加上 u 标志 /./u.text('😊'),所以写正则的时刻要记得加上哦。

字符串遍历

关于字符串的遍历能够运用 for...of 语句。

场景

假如后端数据库运转存储 emoji 作为用户名时,前端在限定用户名长度推断时须要注重UTF-16 4字节字符带来的统计毛病,其他相似场景同理可得。

小提示:在做微信民众号开辟时,由于用户名和用户输入能够涌现 emoji 等字符,须要对数据库举行字符集的设置。

不要问我为何晓得,由于我的眼里常含泪水。

一同生长

在疑心的城市里总少不了并肩偕行的
同伴 让我们一同生长。

  • 假如您想让更多人看到文章能够点个 点赞
  • 假如您想鼓励小二能够到 Github 给个 小星星
  • 假如您想与小二更多交换增加微信 m353839115

《逐日 30 秒 ⏱ 字符编码排雷录》

本文原稿来自
PushMeTop


推荐阅读
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • JavaScript中的数组是数据集合的核心结构之一,内置了多种实用的方法。掌握这些方法不仅能提高开发效率,还能显著提升代码的质量和可读性。本文将详细介绍数组的创建方式及常见操作方法。 ... [详细]
  • 本文将继续探讨前端开发中常见的算法问题,重点介绍如何将多维数组转换为一维数组以及验证字符串中的括号是否成对出现。通过多种实现方法的解析,帮助开发者更好地理解和掌握这些技巧。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 本文介绍如何在MySQL中创建一个自定义函数,用于将包含多个班级编号的字符串拆分为对应的班级名称。通过详细解释代码逻辑和功能,帮助读者理解并应用这一技术。 ... [详细]
  • 本文介绍了如何在React和React Native项目中使用JavaScript进行日期格式化,提供了获取近7天、近半年及近一年日期的具体实现方法。 ... [详细]
  • 本文提供了多种方法来计算给定年份和月份的起始日和结束日,并进一步探讨了如何根据年、月、周获取特定周的起始日和结束日。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
  • 深入理解String.Format()方法的应用
    在.NET框架中,String.Format()方法是一种非常实用的工具,它能够帮助开发者以灵活多样的方式格式化字符串。本文将通过一个具体的示例,详细介绍如何利用String.Format()方法处理数值、日期时间和枚举类型的格式化。 ... [详细]
author-avatar
yixianliu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有