regex 总览待审核
vo · Vertical_Orientation · UAX #50

竖排朝向:同一个字,横排立着、竖排可能要躺倒

把一段中日文从横排转成竖排(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含义竖排里怎么显示典型字符
UUpright原样正立,和字符表里一个朝向漢字、ひらがな 、カタカナ 、中点
RRotated顺时针旋转 90°(躺倒)拉丁 A–z、数字 0–9、半角 ( ) : ;、破折号 、省略号
TuTransformed → Upright有竖排字形就用,否则正立读点句点 、小书写假名 ゃ っ、全角 ! , . ?
TrTransformed → Rotated有竖排字形就用,否则旋转各种括号 「」『』〈〉【】、长音 、波浪 、全角 ():引号 “ ” ‘ ’

上面那串文本逐字拆开,按 vo 上色(URTuTr);每格的字形已在竖排迷你盒里渲染,直接能看出它在竖排里立还是躺:

关键的不对称:U / R 是写死的,任何字体、任何浏览器都一样。但 Tu / Tr 把最终样子交给了字体—— 明朝 / 宋体类字体多半备了这些标点的竖排字形(摆到字格右上、或换成竖排专用形),黑体 / 系统 fallback 字体则常常没有。 一旦缺字形,该回退成什么就成了下一节那桩悬案的全部争点。

悬案:竖排引号该转还是该立

引号 U+2018 / 2019 / 201C / 201DvoTr——按定义,字体竖排字形时应当回退旋转。 现实里各浏览器并不一致(据 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」(不妨)在字形缺失时合成——太松,留了「正立也不算违规」的口子。 提案:村上真雄在 CSSWG issue #14078 主张把这句从 「may wish to」 收紧为 「should」/「are expected to」,强制:字体缺竖排字形时,vo=Tr 应回退旋转。 截至本页写就,这仍是进行中的规范讨论——vo 在码点层定义得很清楚(Tr = 回退旋转), 可「字体缺字形时浏览器到底合成与否」这道缝没焊死,于是同一个竖排引号在三个浏览器里能呈现出三种样子。 和别的页串起来:vo 是竖排版的「显示随上下文变」,正如 Han 统一是「字形随 lang 变」、 归一化那页的 East_Asian_Width 是横排的显示宽度——三者都说明:=== 与正则只认码点, 而屏幕上的样子还受书写模式 / 字体 / 语言摆布。竖排引号这桩悬案,和 bidi 重排一样,都是「存储一个样、显示另一个样」。

🔗 学一学 · 玩一玩