话题标签生成器

一行一个关键词粘进来,工具去掉空格标点与表情,按原样、全小写、首字母大写、驼峰、下划线五种样式转成带 # 的社媒标签,再按你选的平台截断到规定的标签数量与正文字符上限之内。

转换样式(可多选,至少勾一个)
关键词4 行
候选标签20 个
输出标签12 个
标签串字符138 字符
序号标签字符数来源关键词转换样式备注

提示:文本框里 Enter 保留换行,要生成请按 Ctrl + Enter(macOS 用 Cmd + Enter),或点「生成话题标签」。首屏 12 个标签是写在页面里的演示值,换参数后点一下按钮即按你的输入重算。

使用方法

  1. 在文本框里一行一个关键词,最多 50 行。页面打开时已经预置了四行示例,统计卡上显示的 4 行、20 个候选、12 个标签就是它算出来的结果。
  2. 选「目标平台」。这一步同时决定两件事:允许的标签数量上限,以及这个平台正文能放多少字符。
  3. 勾转换样式。五种样式默认全勾,四种英文写法加一种下划线写法;中文关键词做大小写转换是无效操作,五种里会有四种输出同一个字符串,被去重合并掉。
  4. 「输出标签数上限」默认 12,允许 1~60;它会和平台的数量上限取小值。比如选 Instagram(上限 30)而这里填 12,最终就输出 12 个。
  5. 点「生成话题标签」,或在文本框里按 Ctrl + Enter。结果区给出标签清单,下方表格逐行标注字符数、来源关键词与转换样式;点「复制全部」带走,点「导出 CSV」存表,点「复制对照表」按制表符格式粘进 Excel。

这个话题标签生成器能解决什么问题

一是把「人肉手打空格」这一步省掉。社媒标签不能含空格,coffee shop 2026 必须写成 #coffeeshop2026 或 #CoffeeShop2026 才有意义。手动改写十条关键词很容易漏掉一个空格,结果整条标签在平台上就是一段普通文字,点不动也搜不到。

二是一次拿到同义的不同写法。同一个主题在 Instagram 上惯用驼峰、在 X 上惯用小写,本工具把五种写法一次性列出来,你按平台挑一列复制即可,不用来回改。

三是提前知道会不会被平台截断。Instagram 每篇文案最多 30 个标签,YouTube 描述里超过 60 个标签则全部失效,X 单条推文只有 280 字符。这个话题标签生成器在你选平台之后就把数量上限和字符上限同时套上,并且在提示行里写明「数量还剩几个位、字符还剩多少个」,不会让你把 40 个标签丢进 YouTube。

四是去掉重复与大小写打架。标签匹配不区分大小写,#CityWalk 和 #citywalk 指向同一个聚合页;同时用两个只是浪费名额。选「忽略大小写去重」就能把它们合并成一个。

本页不做这些事:不联网查热度、不给标签做效果预测、不做违禁词审核、不区分品牌标签与通用标签。这个话题标签生成器只做格式转换和上限校验,能不能带来流量取决于标签本身选得对不对。想知道一组已有标签用了多少个、字符多长,用页面底部的「话题标签统计」;想看各平台数量规则的原文出处,用「Instagram话题标签数量指南」。

转换原理:按码点清洗、样式改写与平台上限裁剪

清洗这一步按 Unicode 码点走,不按 UTF-16 码元走。代码是 [...文本] 展开后用逐码点判断,保留字符只有四类:拉丁字母 A-Z a-z、数字 0-9、下划线 _、以及 CJK 统一表意文字基本区 U+4E00–U+9FFF。用码点迭代而不是 split('') 的原因是补充平面字符:一个表情在 split('') 下会被切成两个孤立的代理码元,两边都不在保留集合里,虽然最终结果一样是丢掉,但中间态出现半个代理对,遇到还要做长度统计的场景就会算错。这里顺手把空白归一成单个空格,作为后面分词的依据。

为什么下划线是唯一允许的符号。看 RFC 3986 §2.3 的 unreserved 字符集:ALPHA / DIGIT / "-" / "." / "_" / "~"。其中连字符 -、点 .、波浪号 ~ 各平台对标签的定义都不收(Instagram 帮助页明确说空格和 $、% 这类特殊字符都不行),只有下划线 _ 被广泛接受。#coffee_shop_2026 能成立、#coffee-shop-2026 在很多平台上会被拆成三段,差别就在这里。

五种样式的改写规则是可以逐字复述的。先按空格分词得到 [w1, w2, …],然后:原样 = w1+w2;全小写 = (w1+w2).toLowerCase();首字母大写 = 每个词 charAt(0).toUpperCase() + slice(1).toLowerCase() 再相连;驼峰 = 首词小写、其余词首字母大写;下划线 = w1_w2 再转小写。中文关键词的 toUpperCase() 是空操作——汉字没有大小写,'手'.toUpperCase() 还是 '手',所以「手冲咖啡 入门」在四种英文样式下都得到 #手冲咖啡入门,只有下划线样式给出 #手冲咖啡_入门。默认四行关键词之所以只有 12 个标签而不是 20 个,就是被这种同值合并吃掉了 8 个。

去重键的口径有两档。「精确去重」用标签本身当键,只有完全相同的字符串才合并;「忽略大小写去重」改用 tag.toLowerCase() 当键,会把 #coffeeshop2026 与 #CoffeeShop2026 认成同一个。默认选精确去重,是因为大小写不同的写法在视觉上有区别,你可能正想两种都留着给不同平台用;等你确认只要一个时,再切到忽略大小写去重,12 个会进一步合并成 8 个。

最后一步是把平台上限套上去。数量上限取「你填的输出上限」与「平台标签数量上限」的较小值(平台无硬上限时就只用你填的值),字符上限则用来检查标签串总长度。这一步不会替你删标签,只会如实告诉你超了多少——毕竟删哪几个标签是内容判断,不是格式判断。

完整示例(数值仅作演示)

示例条件与页面打开时的默认值完全一致:关键词四行、五种样式全勾、加 # 前缀、精确去重、输出上限 12、平台 Instagram。逐项对账:

下表把四个关键词在五种样式下的全部输出摊开,同一行是一个关键词的五种写法:

关键词原样保留全小写首字母大写驼峰下划线连接
手冲咖啡 入门#手冲咖啡入门#手冲咖啡入门#手冲咖啡入门#手冲咖啡入门#手冲咖啡_入门
coffee shop 2026#coffeeshop2026#coffeeshop2026#CoffeeShop2026#coffeeShop2026#coffee_shop_2026
City Walk#CityWalk#citywalk#CityWalk#cityWalk#city_walk
咖啡豆 烘焙#咖啡豆烘焙#咖啡豆烘焙#咖啡豆烘焙#咖啡豆烘焙#咖啡豆_烘焙

同一批候选换三种去重口径,输出个数差别很大,这也是「为什么默认不是 20 个」的答案:

去重方式输出标签数怎么来的
不去重204 行 × 5 样式,全部原样输出,含大量完全相同的串
精确去重(默认)12完全相同的字符串只留第一个,#CityWalk 与 #cityWalk 仍然共存
忽略大小写去重8再把 #CityWalk/#citywalk/#cityWalk 合并成 1 个

输入范围与平台上限对照表

下表是五个平台的官方数字。数量上限与字符上限都取自各平台的帮助页或开发者文档,这类数字会随版本调整,用之前建议按「依据」一列去复核一次:

平台承载字段标签数量上限正文字符上限依据
Instagram帖子 / Reels 文案30 个2200developers.facebook.com(每篇文案 30 个标签)
YouTube视频描述60 个(超过则全部忽略)5000support.google.com
TikTok视频文案无独立上限2200developers.tiktok.com
X / Twitter单条推文无独立上限280help.x.com
LinkedIn帖子正文无独立上限3000LinkedIn 帮助页

文本框、输出上限与样式的允许范围:

输入项允许范围默认值越界时页面怎么处理
关键词框1~50 行,每行清洗后至少剩 1 个可用字符4 行空框、全被清洗成空的行走具体报错,不静默出空结果
输出标签数上限1~60 的整数120、−1、61、小数、字母、空值逐项报错
转换样式5 种里至少勾 1 种5 种全勾一个都不勾时报错并清空结果
目标平台5 个选项之一Instagram下拉框不提供非法值
去重方式精确 / 忽略大小写 / 不去重精确下拉框不提供非法值

单个标签的长度也有实际约束:Instagram 不限制单条标签的长度,但过长的标签在界面上会被截断显示;绝大多数平台把标签当成一个整体词来索引,超过 20 个字符之后基本没人会完整输入。本页不做单条长度截断,只在表格里把字符数列出来,让你自己判断。

边界与舍入说明

常见问题

为什么四个关键词只出来 12 个标签,不是 20 个?

因为默认开了精确去重。「手冲咖啡 入门」在四种英文样式下都得到 #手冲咖啡入门——汉字没有大小写,toUpperCase() 不改变任何字符,于是这四个候选是同一个字符串,只保留一个。把「去重方式」切到「不去重」就能看到完整的 20 条,其中 8 条是重复串。

YouTube 是不是超过 15 个标签就全部失效?

不是,这个说法在大量教程里被反复传抄但和官方文档不符。YouTube 帮助页写的是「If a video or playlist has more than 60 hashtags, we'll ignore each hashtag on that content」,阈值是 60。15 这个数字更像是「建议只用 3~5 个」这类最佳实践被误当成了硬规则。

标签前面的 # 是必须的吗?

在社媒平台上是必须的,coffee2026 只是一段文字,#coffee2026 才是标签。本页的「加 # 前缀」默认勾选,取消勾选后输出的是裸词,适合拿去当文件名、SKU 或数据库字段值——那些场景里井号反而是非法字符。

为什么下划线能保留,连字符和点号却被删掉?

看 RFC 3986 §2.3 的 unreserved 集合,下划线 _、连字符 -、点 .、波浪号 ~ 都在里面,但只有下划线被各平台普遍接受为标签字符。Instagram 帮助页明确说空格和 $、% 这类特殊字符都不行;连字符在多数平台上会把标签切断。所以本页只放行下划线这一个符号。

「精确去重」和「忽略大小写去重」该选哪个?

先用精确去重。它保留 #CityWalk、#citywalk、#cityWalk 三种写法,你可以挑一个风格统一的;等你确认平台和风格之后,再切到忽略大小写去重,输出会从 12 个进一步压到 8 个,避免同一篇帖子里出现两个指向同一个聚合页的标签。

粘贴进来带标点和表情会怎样?

会被直接丢弃,并且在清洗后再判断这一行还剩不剩可用字符。比如 coffee ☕️ shop! 会变成 coffee shop,进而生成 #CoffeeShop;如果整行只有表情和标点,清洗后为空,这一行会被跳过并在提示行里报出来,不会凭空产生一个 # 单独成行的标签。

标签的数量上限和正文的字符上限,哪个会先撞到?

按默认示例的平均长度 9 到 10 个字符算,Instagram 的 30 个标签大约占 300 字符左右,离 2200 的字符上限还差得很远,所以先撞的是数量上限。唯一例外是 X:它没有标签数量上限,但整条推文只有 280 字符,长标签堆到十几个就会先撞字符上限。

生成的结果会保存到服务器或者被上传吗?

不会。清洗、分词、样式转换、去重、上限校验全部在这一个页面里完成,代码里没有任何网络请求,也不会写入浏览器存储,刷新页面后文本框回到预置的四行示例。想自己确认,打开开发者工具的 Network 面板,点几次「生成话题标签」,不会看到新的请求。

相关工具