跳转到主要内容
本页介绍在撰写 Tweet 以及在 X API 中对字符的处理方式。有关实现的更多信息,X 提供了开源的 twitter-text 库,可在 GitHub 获取。

背景

X 最初是一项基于短信的服务。这将最初的 Tweet 长度限制为 140 个字符(部分原因是短信的 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带尖音符的拉丁小写字母 aU+00E1
ӑ1带短音符的西里尔小写字母 aU+04D1
1带抑扬符与尖音符的拉丁大写字母 OU+1ED2

Emoji

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

中文 / 日文 / 韩文字形

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

实体对象

Tweets 可以包含实体对象,其中一些会影响 Tweet 的长度。 URLs:所有 URL 都会被封装为 t.co 链接。这意味着 URL 的长度由 twitter-text 配置文件中的 transformedURLLength 参数定义。当前在 Tweet 中,一个 URL 计为 23 个字符,即使该 URL 的实际长度更短。 Replies:在回复 Tweet 开头自动填充的 @name 不计入字符上限。以 @mention 开头的新非回复 Tweet 会计入,用户在 Tweet 正文中明确添加的 @mentions 也会计入。 Media:附加在 Tweet 上的媒体(若由官方客户端发布,会以 pic.x.com URL 表示)计为 0 个字符。 有关实体对象的更多信息,请参阅开发者文档

X 字符编码

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