热门标签 | 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 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
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社区 版权所有