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


推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • JavaScript中属性节点的类型及应用
    本文深入探讨了JavaScript中属性节点的不同类型及其在实际开发中的应用,帮助开发者更好地理解和处理HTML元素的属性。通过具体的案例和代码示例,我们将详细解析如何操作这些属性节点。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文介绍了在Windows Server 2003环境下,使用XAMPP Lite 1.7.1和DotProject 2.1.3时遇到的日历和甘特图中文乱码问题的解决方案。通过修改相关文件和配置,可以有效解决这些问题。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 20100423:Fixes:更新批处理,以兼容WIN7。第一次系统地玩QT,于是诞生了此预备式:【QT版本4.6.0&#x ... [详细]
  • 探讨在 JavaScript 中使用不同方向的 for 循环来实现跟随鼠标的 div 动画时,为什么会出现不同的视觉效果。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
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社区 版权所有