跳转到主要内容
本页说明在撰写 Tweet 以及在 X API 中如何计算和处理字符。有关实现的更多信息,X 提供了开源的 twitter-text 库,托管于 GitHub

背景

X 最初是一项基于 SMS 的短信服务。这将早期的 Tweet 长度限制为 140 个字符(部分原因在于 SMS 的 160 字符限制,其中 20 个字符需保留给命令和用户名)。随着 X 的演进,Tweet 的最大长度增加到 280 个字符——仍然简短精炼,但能容纳更多表达。

字符的定义

在大多数情况下,Tweet 的文本内容最多可包含 280 个字符或 Unicode 字形。某些字形会按多个字符计数。 我们将某个字形按一个或多个字符计数的情况称为其权重。关于哪些字符的权重大于 1 的精确定义,请参见 twitter-text Tweet 解析库配置文件 当前版本的配置文件定义了默认的双字符权重,以及四个权重不同的 Unicode 码点范围。目前这些范围内的码点均按单个字符计数。
  • 第一范围涵盖 Latin-1 代码页中的字符(U+0000 - U+10FF)。
  • 第二范围是通用标点,直到并包含零宽连接符(用于组合表情符号和其他字形)(U+2000 - U+200D)。
  • 第三范围是通用标点,但不包括 U+200E 和 U+200F,这两个是 Unicode 方向性标记(U+2010 - U+201F)。
  • 最后一范围涵盖引号(U+2032 - U+2037)。
由 twitter-text 库计算的 Tweet 文本与长度示例可在该库的测试配置文件 validate.yml 中找到。 示例
显示字符长度描述Unicode 序列
a1拉丁小写字母 aU+0061
á1拉丁小写字母 a(带尖音符)U+00E1
ӑ1西里尔小写字母 a(带短音符)U+04D1
1拉丁大写字母 O(带抑扬符和尖音符)U+1ED2

表情符号

twemoji 支持的表情符号始终按两个字符计数,无论是否包含组合修饰符。此规则同样适用于经过 Fitzpatrick 肤色性别修饰符修改的表情符号,即使它们由明显更多的 Unicode 代码点组成。表情符号的权重由 twitter-text 中的正则表达式定义,用于匹配由标准表情符号与一个或多个 Unicode 零宽连字器(U+200D)组合而成的序列。 示例
显示的表情符号长度说明Unicode 序列
👾2已知表情符号的默认长度
🙋🏽2带有肤色修饰符的表情符号🙋 U+1F64B, 🏽 U+1F3FD
👨‍🎤2使用组合字形(零宽连字器)的表情符号序列👨 U+1F468, U+200D, 🎤 U+1F3A4
👨‍👩‍👧‍👦2使用多个组合字形(零宽连字器)的表情符号序列👨 U+1F468, U+200D, 👩 U+1F469, U+200D, 👧 U+1F467, U+200D, 👦 U+1F466

中文 / 日文 / 韩文字形

CJK(中文 / 日文 / 韩文)语言中使用的字形也按两个字符计算。因此,仅由 CJK 文本组成的 Tweet 最多只能包含 140 个此类字形。

实体对象

Tweet 可以包含实体对象,其中一些会影响 Tweet 的长度。 URL:所有 URL 都会被封装为 t.co 链接。这意味着 URL 的长度由 twitter-text 配置文件中的 transformedURLLength 参数定义。目前 Tweet 中的 URL 统一计为 23 个字符,即使其实际长度更短。 回复:在回复 Tweet 开头自动填入的 @名称 不计入字符上限。新发布的非回复 Tweet 若以 @提及 开头会计入,用户在 Tweet 正文中主动添加的 @提及 也同样计入。 媒体:附加到 Tweet 的媒体(若由官方客户端发布,将以 pic.x.com URL 呈现)计为 0 个字符。 有关实体对象的更多信息,请参阅开发者文档

X 字符编码

X API 端点仅接受 UTF-8 编码的文本。将文本发送到 API 之前,所有其他编码都必须先转换为 UTF-8。 X 使用文本的标准化形式 C(NFC)来计算一条 Tweet 的长度。 例如:单词“café”。有两种字节序列在视觉上相同、读起来也一致,但占用的字节数不同:
café0x63 0x61 0x66 0xC3 0xA9使用“é”字符,即合成字符(composed character)。
café0x63 0x61 0x66 0x65 0xCC 0x81使用组合变音符(combining diacritical),叠加在“e”上。
标准化形式 C 会优先使用完全组合的字符(café 示例中的 0xC3 0xA9),而非长形式(0x65 0xCC 0x81)。 X 按文本中的码点数量计数,而不是按 UTF-8 字节数计数。café 示例中的 0xC3 0xA9 是一个码点(U+00E9),在 UTF-8 中用两个字节编码;而 0x65 0xCC 0x81 是两个码点,用三个字节编码。