计算推文长度的正确姿势

562 阅读3分钟

【twitter-character-counter: 在线体验地址

在社交媒体平台上,尤其是 Twitter(现在的 X 平台),推文的长度限制是一个重要的考虑因素。尽管 Twitter 允许每条推文最多包含 280 个字符,但推文长度的计算方式并不仅仅是简单的字符计数。了解 Twitter 的字符计数规则对于有效地利用推文空间至关重要。

Twitter 字符计数规则

Twitter 的字符计数规则有几个关键点:

  1. 普通字符:包括大多数拉丁字母、数字和标点符号,每个字符计为 1。
  2. 非基本多文种平面 (BMP) 字符:如大多数表情符号,计为 2 个字符。
  3. URL:无论其实际长度,每个 URL 计为 23 个字符。
  4. 变体选择符:如 U+FE0F,不单独计数,但会影响前面的字符。

具体规则解析

  1. 普通字符:这些字符包括常见的字母、数字和标点符号。它们在推文中每个计为 1 个字符。

    例子:

    "Hello, World!" -> 13 个字符
    
  2. 非 BMP 字符:这些字符包括大多数表情符号和其他特殊符号,它们在推文中每个计为 2 个字符。

    例子:

    "😊" -> 2 个字符
    
  3. URL:无论 URL 的实际长度是多少,Twitter 都会将其计为 23 个字符。这是因为 Twitter 会自动将 URL 缩短。

    例子:

    "https://example.com" -> 23 个字符
    
  4. 变体选择符:变体选择符本身不单独计数,但会影响它前面的字符的计数。例如,表情符号 😊 后跟一个变体选择符 ,它们一起只计为 2 个字符。

    例子:

    "😊️" -> 2 个字符
    

实现推文长度计算的 Go 代码

以下是一个使用 Go 实现推文长度计算的示例代码:

package main

import (
	"fmt"
	"regexp"
	"strings"
	"unicode"
	"unicode/utf8"
)

const (
	TWITTER_URL_SIZE          = 23
	TWITTER_SPECIAL_CHAR_SIZE = 2
	TWITTER_STANDARD_CHAR_LIMIT = 0x2037
)

var URL_MATCH = regexp.MustCompile(`https?://[^\s]+`)

// isSpecialChar 判断字符是否为表情符号或其他非标准的 Unicode 字符,并忽略变体选择符
func isSpecialChar(r rune) bool {
	if r >= 0xFE00 && r <= 0xFE0F {
		return false // 忽略变体选择符
	}
	return unicode.Is(unicode.S, r) || unicode.Is(unicode.M, r) || unicode.Is(unicode.P, r) || unicode.Is(unicode.Sk, r)
}

// findSpecialChars 查找文本中的所有表情符号和其他非标准的 Unicode 字符
func findSpecialChars(text string) []string {
	var specialChars []string
	for _, char := range text {
		if isSpecialChar(char) && int(char) > TWITTER_STANDARD_CHAR_LIMIT {
			specialChars = append(specialChars, string(char))
		}
	}
	return specialChars
}

// findUrls 查找文本中的所有 URL
func findUrls(text string) []string {
	return URL_MATCH.FindAllString(text, -1)
}

// countTweet 根据推特的规则计算推文的总长度
func CountTweet(tweetText string) int {
	// 查找并移除文本中的 URL
	urls := findUrls(tweetText)
	for _, url := range urls {
		tweetText = strings.Replace(tweetText, url, "", 1)
	}

	// 查找并移除文本中的特殊字符
	specialChars := findSpecialChars(tweetText)
	for _, char := range specialChars {
		tweetText = strings.Replace(tweetText, char, "", 1)
	}

	// 计算推文的总长度
	urlsLength := len(urls) * TWITTER_URL_SIZE
	specialCharsLength := len(specialChars) * TWITTER_SPECIAL_CHAR_SIZE
	tweetLength := utf8.RuneCountInString(tweetText) + urlsLength + specialCharsLength

	return tweetLength
}

使用示例

下面是一个使用上述 Go 包的示例程序:

package main

import (
	"fmt"
	"github.com/alwaysday1/twitter-character-counter"
)

func main() {
	postContent := "今天"

	length := twittercharacter.CountTweet(postContent)
	fmt.Printf("推文长度根据自定义规则:%d\n", length)
}

推荐的 Go 包

为了简化推文长度的计算,可以使用我们开源的 Go 包 twitter-character-counter。该包实现了上述所有字符计数规则,确保你在发布推文时准确计算字符长度。

安装

使用以下命令安装包:

go get github.com/alwaysday1/twitter-character-counter

使用

在你的 Go 项目中导入并使用该包:

import (
	"fmt"
	"github.com/alwaysday1/twitter-character-counter"
)

func main() {
	postContent := "12345678"
	length := twittercharacter.CountTweet(postContent)
	fmt.Printf("推文长度根据自定义规则:%d\n", length)
}

通过使用 twitter-character-counter 包,你可以轻松准确地计算推文的长度,确保你的推文符合 Twitter 的字符限制规则。希望这篇文章对你理解和计算推文长度有所帮助!如果有任何问题或建议,欢迎在 GitHub 上提交 issue 或 pull request。