热门标签 | 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


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • python3连接外部Mysql
    前提条件,已经安装过MySQL(比如说以前web开发安装过MySQL)1.安装PyMySQLpipinstallPyMySQL2.测试1i ... [详细]
  • java开发公众号,java自学网公众号
    本文目录一览:1、JAVA微信公众号开发回复消息能回复多条吗?具体怎么代码实现? ... [详细]
  • 本篇文章为大家展示了input语句的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。HTML标签 ... [详细]
  • 字面|开辟_一文入门JavaScript
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了一文入门JavaScript相关的知识,希望对你有一定的参考价值。@toc ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • python数据可视化matplotlib专题:带数据标签的双batch的Bar图绘制示例
    基于matplotlib的双Batch带标签bar图生成函数李俊才邮箱:291148484163.com【代码实现】importmatplotlibimpor ... [详细]
  • mysql字符集和表字符集_Mysql数据库表引擎与字符集
    Mysql数据库表引擎与字符集1.服务器处理客户端请求其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句) ... [详细]
  • stm32单片机控制28BYJ48步进电机原理及代码
    命名方式(以28BYJ48步进电机为例)28BYJ48步进电机的编号28-----步进电机的有效最大外径是28毫米B-----表示步进电机Y-- ... [详细]
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社区 版权所有