CJK and Latin need a gap between them
Aliases: text-autospace · inter-script spacing · Han-Latin gap
What it is
In a string like 「版本3.2已发布」, if Han, Arabic numerals, and Latin letters meet at zero gap, the boxes collide: Han carries a little shoulder of its own, Latin sidebearings were cut for letters inside a word, and when the two boxes touch the English looks jammed into the teeth of the Chinese. Mixed setting needs a thin gap at that boundary — about a quarter to half a Han width, optically closer to half a Latin word space — to separate the scripts. Neither a casual ASCII space nor a dead bump.
The gap is not ordinary tracking. Tracking is density inside one script. This seam sits on the script boundary.
Why it happens
The Han square builds “air between characters” into the shoulders, so Han usually needs no extra space. Latin words separate on a word space; letters themselves have only narrow sidebearings. At a mixed boundary the two tokenisers both fail: the left assumes “the neighbour already brought a seam,” the right assumes “the space character will supply it.” So 「的API」clots into one lump, as if a space were missed; a fullwidth space, conversely, is so large it yanks the word out of the sentence.
The thin gap’s job is to admit that a script switch happened, to give the eye a “new clump starts here” without opening a hole in the paragraph. Numerals, units, product names, and short English are the most frequent boundaries. Inside a run of English the Latin word spaces stay; the thin seam is only at the two ends, where the phrase meets Han. Put it outside iPhone, not between i and P.
Engines that support something like text-autospace insert on script boundaries and are steadier than authors tapping spaces: a tapped space follows Latin word-space width, usually too wide, and leaves mysterious holes when the string is copied into an all-Han context.
Where it stops holding
An all-Latin paragraph or an all-Han paragraph has no script boundary, so no seam. Code, formulae, and tabular digit strings have their own spacing; do not let the mixed-script gap split user_id or 3.14. A proper name treated as a logo should not be auto-spaced internally either. Japanese sometimes runs tighter; do not export Chinese seam width wholesale. At very small sizes the thin gap can be eaten by the pixel grid and look absent — that is rasterisation, not permission to skip it.
Applying it
- Leave a thin gap where Han meets Latin letters or Arabic numerals. No fullwidth space, and no dead contact.
- Prefer the engine’s script-boundary autospace over halfwidth spaces typed in the copy. Typed spaces swell with the Latin word space and travel with the clipboard.
- Treat an English phrase as one block: seams on the outside, Latin word spaces inside.
- Find every neighbour pair of “Chinese + digit / English” in the UI and label the gap none / thin / one Latin space / fullwidth. None and fullwidth fail; a full Latin space is usually too wide and fails too. Only the thin seams are mixed-script boundaries doing their job.