微博

微博

简单

说明

你发现社交媒体市场上存在一个空白:非常非常短的帖子。 如今 Twitter 允许发布 280 个字符的帖子,那些想要快速更新社交动态的人依然无法得到满足。 你决定创建自己的社交网络。

为了让产品引人注目,你把它做得很极端:只允许发布 5 个或更少字符的帖子。 超过 5 个字符的帖子一律截断为 5 个字符。

为了让用户充分表达自己,你允许使用表情符号和其他 Unicode 字符。

任务是:把输入的字符串截断为 5 个字符。

文本编码

以数字方式存储的文本必须转换成一连串的字节。 把字符映射为字节的常用方式有 3 种。

  • ASCII可以编码英文字符。 所有字符都恰好占 1 个字节。
  • UTF-8是一种 Unicode 文本编码。 字符占 1 到 4 个字节。
  • UTF-16是一种 Unicode 文本编码。 字符占 2 个或 4 个字节。

UTF-8 和 UTF-16 都是 Unicode 编码,也就是说它们能够表示范围极其广泛的字符,包括:

  • 世界上大多数语言和文字的文本
  • 历史文本
  • 表情符号

UTF-8 和 UTF-16 都是变长编码,也就是说,不同的字符占用的空间大小不同。

看看字母 'a' 和表情符号 '😛'。 在 UTF-16 中,这个字母占 2 个字节,而这个表情符号占 4 个字节。

这道练习的诀窍在于,使用围绕 Unicode 字符(码点)设计的 API,而不是 Unicode 码元。

Unicode 码点与码元

一个“正常”的 UTF-16 编码字符串可以表示成一串字符,其中每个字符最长 16 位(UTF-16 这个名字正由此而来)。 这意味着,16 位(也就是 1 个码元)最多能表示 2¹⁶(2 的 16 次方),即 65536 个字符。 这 65536 个字符构成了所谓的基本多文种平面,它大到足以容纳大多数语言中最常见的字符。

不过,有些符号无法只用一个码元表示。解决办法是用两个码元来表示它们。 这两个 UTF-16 码元通常也被称为代理对,它们一起构成一个码点。

总之,在谈到 UTF-16 编码时:

  • 一个code unit是 16(或更少)位,表示单个字符。
  • 一个code point是一个或两个码元,表示单个字符。

更让人混淆的是,还有字素簇,它基本上就是应当被当作一个视觉单位的 Unicode 字符(码点)序列。 例如,某些 emoji,比如这个 👨‍👦。

Javascript 中的 UTF-16

大多数内置的 Javascript 方法都能处理 UTF-16 编码的字符串,不过它们是基于 UTF-16 码元来工作的。 例如,String.prototype.split("")方法会按码元拆分字符串。

另一方面,String iterators则按码点进行迭代。

关于 Unicode 字符串,你可以在 MDN 上读到更多内容,并找到不少示例。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 微博 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。