免費

讓 Claude 寫多語言推文 thread 不超限

多語言 thread 不是翻譯問題:用 write 替代 translate,配 .length 本地閘門,一版就近限。


今天發了 5 篇文章。每篇帶 6 種語言的推文 thread(en / zh / ja / ko / ar / id),每種語言 4 條,一共 120 條推文。

其中 4 篇都得給中文推文做裁剪。原始數字(script 印出,格式 chars/limit):

zh[1]=160/140 OVER
zh[2]=164/140 OVER
zh[3]=152/140 OVER
...
id[3]=286/280 OVER
zh[2]=163/140 OVER
zh[3]=148/140 OVER
zh[2]=152/140 OVER

每次都是同樣的模式:英文四條先寫好(每條 230-260 字元,逼近 280 的上限),然後讓 Claude「基於這四條生成中文版」。結果中文版本基本都超 140。

這事不是 bug,是你對 Claude 說了錯詞——「翻譯」兩個字會讓它逐句翻,而多語言 thread 不是翻譯問題,每種語言都得按自己的上限從頭寫。本文講怎麼讓 Claude 第一版就近限,不用 3-5 輪裁剪。


根本原因:X 對 CJK 加權 × Claude 預設逐句翻

X 的字元計數規則

X 的長度限制不是按「字元數」算,而是按 weighted characters
- 拉丁字母、數字、標點:1 weight 每字元
- CJK 字元(中/日/韓)、某些 emoji:2 weight 每字元
- 推文總上限 280 weight

實際效果:
- 英文推文上限 280 字元
- 純中文推文上限 140 字元(140 × 2 = 280)
- 中英混排按每字元 1 或 2 算

所以「英文 260 字元翻成中文」不是中文版 260 字——中文版只有 130 字的空間。英文保留的所有標點、引號、程式碼 backtick 都還佔位,但中文字元每個都 double。翻出來必然超。

「translate」這個詞觸發 Claude 的逐句翻

Claude 看到 "translate these 4 EN tweets to ZH" 時,第一反應是保留英文句子結構,只把字換成中文

  • 英文:"Production 400/500 isn't like local. User's already staring at a blank screen after hitting Pay."
  • Claude 逐句翻:「生產環境的 400/500 和本地並不相同。使用者已經點擊了『付款』並看著一個空白螢幕。」(40 字)

意思對,但:
- 保留了「並不相同」(比「不同」多一字)
- 保留了「已經點擊了」(「剛點完」更短)
- 保留了「並看著一個空白螢幕」(「看著空白螢幕」更短)

每一處保留的冗餘都佔字——累積 4 條,差個 20-40 字輕鬆,然後就超限了

有效的 prompt:用「重寫」替代「翻譯」

比較兩個措辭:

無效 prompt

"Translate these 4 English tweets to Chinese, Japanese, Korean, Arabic, Indonesian."

有效 prompt

"For each of these 4 points, write a thread in ZH / JA / KO / AR / ID. Each language gets a fresh pass — same argument, adjusted for that language's tweet budget.

  • ZH: ≤ 140 chars per tweet, hook-first, cut detail if needed
  • other languages: ≤ 280 chars
  • use each language's natural phrasing, don't preserve EN sentence structure
  • each tweet must be self-contained but add 🧵 only on tweet 1"

差別:
1. 「write」替代「translate」——觸發 Claude 的創作模式,不是翻譯模式
2. 「fresh pass」/「same argument」——允許 Claude 重新組織句子
3. 「don't preserve EN sentence structure」——直接擋掉預設行為
4. 「cut detail if needed」——給它刪內容的權限(不給的話它會保留全部事實再超限)
5. 每語言明確上限——數字寫死,不是「short」

本地 sanity check:Ruby 腳本 + .length

別靠肉眼數。寫個小腳本每次都跑:

tweets.each do |loc, list|
  list.each_with_index do |t, i|
    len = t.length
    limit = loc == "zh" ? 140 : 280
    status = len > limit ? "OVER" : "ok"
    puts "#{loc}[#{i}]=#{len}/#{limit} #{status}"
  end
end

Ruby String#length 回傳 Unicode codepoints——對 CJK 字元每個算 1。X 把 CJK 按 2 weighted char 算,但中文推文上限 140 codepoints(因為 140 × 2 = 280 weighted),所以 .length 直接和 X 的上限對齊。誤差只來自:
- emoji 的 codepoint 數(🧵 是 1 codepoint,但有些 emoji 由多個 codepoint 組成)
- 零寬字元(ZWJ 等)

絕大多數情況下 Ruby .length 對 CJK 推文 ± 1 字元就和 X 計數一致。用它做前置閘門比上 X 試發靠譜 100 倍。

emoji 和 backtick 坑

中文推文裡要省字,兩類字元最先砍:

backtick(`

程式碼引用 `kamal exec` 在中文語境裡每個 backtick 吃 1 字——一段程式碼引用就吃 2 字,還不貢獻語意。做法:
- 能用冒號提示的就用冒號:「指令 kamal exec」而不是「`kamal exec`
- 真必要保留 backtick 的地方只給關鍵識別字,不給整段 shell

emoji

🧵 只在 thread 第一條加。其他 emoji 在中文推文裡慎用——每個 emoji 基本佔 2 字(1 codepoint + 有時候 ZWJ 修飾符)。

全形 vs 半形標點

  • 中文標點(「」、,。——)一個字元 weighted 2
  • 英文標點("",-)一個字元 weighted 1
  • 推文在中文裡混用引號時:用半形引號'X')比全形(「X」)每對省 2 字

Claude 預設走錯的 4 方向

讓 Claude 生成多語言 thread 時這 4 個要攔:

1. 逐句翻譯保留英文結構

症狀:中文句子裡出現「並不相同」「已經點擊了」「一個空白螢幕」這種顯然從英文直譯過來的表達。

攔法:prompt 裡明寫 "don't preserve EN sentence structure"、"use natural ZH phrasing"。

2. 不主動做長度計算

症狀:Claude 生成完說「done」,實際超限但它不知道。

攔法:prompt 要求 Claude 生成完自己數一遍("count each tweet's char length and flag any over the limit"),或者你本地跑 script 作為閘門。我選後者——Claude 自己數不如 Ruby 精確。

3. 引號和 emoji 不計入

症狀:Claude 數的時候忽略 emoji 和全形引號的額外 weight。

攔法:不要問 Claude「是否超限」——直接本地算 .length,再根據結果讓 Claude 縮。

4. 只在第一條加 🧵(或全加)

症狀:有時候 Claude 每條都加 🧵、有時候只加第一條、有時候加在 4/4 結尾。

攔法:prompt 明寫「🧵 only on tweet 1」。這件事 Claude 不預設知道 thread 的視覺慣例。

清單

讓 Claude 第一版就生成近限多語言 thread 的 6 條:

  1. 用「write」替代「translate」。翻譯觸發逐句翻 = 保留英文結構 = 超限。
  2. 每種語言明確上限:「≤ 140 chars」比「short」有效 100 倍。
  3. 給刪內容的權限"cut detail if needed" 讓 Claude 知道它可以損失細節去適配長度。
  4. 本地 Ruby .length 做前置閘門。比 Claude 自己數準、比上 X 試發快。
  5. 中文推文裡先砍 backtick 和 emoji。每個 backtick 吃 1 字,每個 emoji 吃 2 字。
  6. 🧵 位置要在 prompt 裡寫死,Claude 不預設知道 thread 視覺慣例。

真正的洞見:Claude 能寫對多語言 thread,但它預設的反應是「翻譯」——你要用 prompt 把它撥到「按每語言獨立重寫」的模式。加上 .length 閘門後,今天最後一篇的中文推文第一版就是 140/140 剛好——不用裁剪。