竖排朝向:同一个字,横排立着、竖排可能要躺倒
把一段中日文从横排转成竖排(writing-mode: vertical-rl),汉字、假名原样立着,可夹在中间的拉丁字母、数字、半角括号会整体躺倒 90°。
这不是浏览器随手转的:每个 code point 在 UCD 里都记了一栏 Vertical_Orientation(vo),由 UAX #50 定义——
横排时它毫无作用,一进竖排就逐字决定朝向。它和 General_Category / Script、
以及 归一化那页讲的 East_Asian_Width 一样,是码点的固有档案;区别是
JS 的 \p{…} 并不暴露它(和 Block 一样,见属性类页末)。
本页把四个取值 U / R / Tu / Tr 用浏览器真实竖排渲染出来,最后看一桩仍在 W3C 争的悬案:竖排里的引号到底该转还是该立。
两个 CSS 属性:writing-mode 竖过来,text-orientation 管朝向
writing-mode: vertical-rl 把文本流竖排、列从右往左推进;text-orientation 再决定每个字的朝向,三个取值:
mixed(默认,按各字的 vo 逐字决定)、upright(强制全部正立,连拉丁也立起来)、
sideways(强制全部旋转)。输入一段文本(或点预设),三列并排看同一串在三种 text-orientation 下的差异:
mixed · 按 vo 逐字默认值 —— 汉字假名立、拉丁躺倒,各从其 vo
upright · 强制正立连 Latin / 数字也立起来,适合纯西文的竖排标签
sideways · 强制旋转整段顺时针转 90°,汉字也躺倒,几乎只用于排注记
text-orientation 不同。middle 这列(默认)就是你平时见到的竖排日文——
它逐字查 vo:汉字 / 全角假名 vo=U 立着,拉丁 / 数字 vo=R 躺倒。
右两列把 vo 整段覆盖掉,所以同一个拉丁字母在三列里能立、能躺、能保持。
vo 是 Unicode 层面的属性,对 CJK 各语言统一(同一批汉字 / 标点码点),所以本页所有示例对中文竖排同样成立——下方预设「中文竖排」即繁体一例。
mixed 背后:每个码点的 vo 档案,四个取值
上面 mixed 列逐字查的就是 vo。它有四个取值,U / R 是固定朝向,
Tu / Tr 是「变换类」——先看字体里有没有竖排专用字形(OpenType vert 特性,把字符摆到竖排该在的位置 / 形状),
有就用它,没有才回退。回退到正立的是 Tu,回退到旋转的是 Tr:
| vo | 含义 | 竖排里怎么显示 | 典型字符 |
|---|---|---|---|
| U | Upright | 原样正立,和字符表里一个朝向 | 漢字、ひらがな あ、カタカナ ア、中点 ・ |
| R | Rotated | 顺时针旋转 90°(躺倒) | 拉丁 A–z、数字 0–9、半角 ( ) : ;、破折号 —、省略号 … |
| Tu | Transformed → Upright | 有竖排字形就用,否则正立 | 读点句点 、 。、小书写假名 ゃ っ、全角 ! , . ? |
| Tr | Transformed → Rotated | 有竖排字形就用,否则旋转 | 各种括号 「」『』〈〉【】、长音 ー、波浪 〜、全角 ():、引号 “ ” ‘ ’ |
上面那串文本逐字拆开,按 vo 上色(URTuTr);每格的字形已在竖排迷你盒里渲染,直接能看出它在竖排里立还是躺:
U / R 是写死的,任何字体、任何浏览器都一样。但 Tu / Tr 把最终样子交给了字体——
明朝 / 宋体类字体多半备了这些标点的竖排字形(摆到字格右上、或换成竖排专用形),黑体 / 系统 fallback 字体则常常没有。
一旦缺字形,该回退成什么就成了下一节那桩悬案的全部争点。
悬案:竖排引号该转还是该立
引号 U+2018 / 2019 / 201C / 201D 的 vo 是 Tr——按定义,字体缺竖排字形时应当回退旋转。
现实里各浏览器并不一致(据 W3C public-i18n-japanese 邮件列表的讨论):
mixed)这段含 Tr 的引号 “ ” 与括号 『 』,以及 R 的破折号 ――
这里有个常被忽略的分流:中文(尤其繁体竖排)与日文,正文里更常用直角引号 「」 『』(U+300C 等,同样 vo=Tr)。它们是为 CJK 设计的,字体几乎都备了竖排字形,竖排里稳定呈现为左上 / 右下的角标,落不到下面那个「转还是立」的争议里。真正出问题的是借来的西式弯引号 “ ”(U+201C 等):字体常常没给它们配竖排字形,各浏览器的回退分歧才暴露出来——这也是台 / 港竖排排版规范偏好直角引号的原因之一。
vo=Tr 引号,在缺竖排字形时——
Firefox 八年前就改成回退旋转(符合 Tr 定义),Safari 大体相同;
而 Chrome(报告称约 148 起)默认正立显示。问题出在 CSS Writing Modes 规范的措辞:它只说浏览器
「may wish to」(不妨)在字形缺失时合成——太松,留了「正立也不算违规」的口子。
vo=Tr 应回退旋转。
截至本页写就,这仍是进行中的规范讨论——vo 在码点层定义得很清楚(Tr = 回退旋转),
可「字体缺字形时浏览器到底合成与否」这道缝没焊死,于是同一个竖排引号在三个浏览器里能呈现出三种样子。
vo 是竖排版的「显示随上下文变」,正如 Han 统一是「字形随 lang 变」、
归一化那页的 East_Asian_Width 是横排的显示宽度——三者都说明:=== 与正则只认码点,
而屏幕上的样子还受书写模式 / 字体 / 语言摆布。竖排引号这桩悬案,和 bidi 重排一样,都是「存储一个样、显示另一个样」。
🔗 学一学 · 玩一玩
-
UAX #50 · Unicode Vertical Text Layout(权威规范)· unicode.org
竖排朝向的源头标准:
vo属性四个取值 U/R/Tu/Tr 的定义、未分配码点的默认区间(CJK 相关默认 U、其余默认 R)、与字体竖排替代字形的关系全部定义于此。本页每格的vo值与默认规则就照它的VerticalOrientation.txt实现。 -
CSS Writing Modes Level 4(权威规范)· w3.org
writing-mode/text-orientation两个属性的规范出处,把vo接进 CSS 的「typesetting」一节,以及那句引发争议的「字体缺竖排字形时浏览器可合成」措辞就在这里。 -
public-i18n-japanese · 竖排引号朝向讨论· lists.w3.org
W3C 国际化日语组的邮件:村上真雄报告 Chrome 把
vo=Tr引号正立显示、与 Firefox/Safari 的旋转回退分歧,并主张收紧规范措辞。本页「悬案」一节即据此线索。 -
CSSWG drafts · issue #14078· github.com
对应的规范修订提案:把字形合成那句从「may wish to」改成「should / are expected to」,要求字体缺竖排字形时
vo=Tr回退旋转。 -
MDN ·
text-orientation&writing-mode· developer.mozilla.org CSS 实操:writing-mode(vertical-rl/lr、sideways-*)与text-orientation(mixed/upright/sideways)的取值、浏览器支持与示例——本页三列对照背后的两个属性。