字符与字节:为什么您的文本比您想象的要大
您将看起来像 100 个字符的字符串粘贴到限制为 100 个字符的字段中,但它因太长而被拒绝。如何?答案是,字符和字节不是同一件事,它们之间的差距是处理文本时最令人困惑的角落之一,直到它咬住你为止。这就是实际发生的情况。
核心区别
在纯 ASCII 中,基本的英文字母、数字和常见符号,一个字符正好是一个字节,因此计数是匹配的,没有人会考虑这一点。但网络运行在 UTF-8 上,这是一种编码,其中基本集之外的字符每个占用多个字节。像 é 这样的重音字母是两个字节。许多亚洲字符都是三个字节。表情符号通常是四个字节。因此,您的文本占用的字节数可能比您看到的字符数大得多,这完全取决于这些字符是什么。
为什么字节大小很重要
这种差距很重要,因为许多限制是按字节而不是字符定义的。数据库字段的大小通常以字节为单位,因此如果字段是多字节,则容纳 100 个字节的字段可能只能容纳 50 个字符。网络负载、消息大小上限和存储配额以字节为单位。某些 API 按字节大小限制请求正文。这正是为什么看起来很好低于字符限制的文本可能会因为太长而被拒绝,限制以字节为单位,并且您的重音字母或表情符号推高了字节数,即使字符数看起来不错。
UTF-8 如何分配字节
UTF-8 在设计上是可变宽度的。它将基本拉丁字母和数字分别编码在一个字节中,从而保持纯英语文本的紧凑性和字符字节的相同。除此之外,它对大多数带重音的拉丁和希腊字符使用两个字节,对大范围的字符使用三个字节,包括大多数中文、日语和韩语字符,对其余字符使用四个字节,包括大多数表情符号和一些罕见的脚本。因此,100 个字符的字符串可以占用 100 到 400 个字节,具体取决于其内容。一条表情符号的推文比一条普通字母的推文要重得多。
表情符号惊喜
表情符号值得特别提及,因为它们最容易造成混乱。大多数表情符号都是 UTF-8 格式的四个字节,而有些表情符号是通过组合多个代码点(例如某些标志或肤色变体)构建的,甚至更多。因此,单个表情符号可以使用与四个纯拉丁字符一样多的字节空间,而复合表情符号可以使用更多的字节空间。视觉上很短但表情符号较多的消息可能会意外超出字节限制。如果您曾经收到过一条充满表情符号的简短消息被拒绝,这就是原因。
实用的外卖
当以字符为单位定义限制时,大多数社交媒体都会发布限制并计算字符数。当以字节为单位定义限制时,许多数据库字段、API 和协议都会计算字节数,并记住重音符号和表情符号会增加字节数。当您不确定系统使用哪个系统并且您的文本包含纯 ASCII 之外的任何内容时,请检查字节大小以确保安全。同时看到这两个数字可以消除猜测并防止“但看起来足够短”的拒绝。