# 文本布局概念

> 原文： [https://docs.oracle.com/javase/tutorial/2d/text/textlayoutconcepts.html](https://docs.oracle.com/javase/tutorial/2d/text/textlayoutconcepts.html)

在显示一段文本之前，必须使用适当的字形和连字对其进行适当的整形和定位。该过程称为 _ 文本布局 _。文本布局过程涉及以下内容：

*   使用适当的字形和连字对文本进行整形
*   正确订购文字
*   测量和定位文本

用于布置文本的信息对于执行诸如插入符号定位，命中检测和突出显示之类的文本操作也是必需的。有关这些文本操作的更多信息，请参见[使用双向文本](../text/textlayoutbidirectionaltext.html)。

要开发可以在国际市场上部署的软件，文本必须以符合适当书写系统规则的方式布置在不同语言中。

本节包括以下主题：

*   [塑造文字](#shaping_text)
*   [订购文字](#ordering_text)
*   [测量和定位文字](#measuring_and_positioning_text)

_ 字形 _ 是一个或多个字符的直观表示。字形的形状，大小和位置取决于其上下文。许多不同的字形可用于表示单个字符或字符组合，具体取决于字体和样式。

例如，在手写草书文本中，特定字符可以采用不同的形状，具体取决于它与相邻字符的连接方式。

在某些书写系统中，特别是阿拉伯语，必须始终考虑字形的上下文。与英语不同，草书形式在阿拉伯语中是强制性的;不使用草书形式呈现文本是不可接受的。

根据具体情况，这些草书形式的形状可以根本不同。例如，阿拉伯字母 _heh_ 具有下图所示的四种草书形式：

<center>![Illustration of unconnected, connect on right, connect on both sides and connect on left cursive forms in Arabic](img/39d2b549dc5bc09f34478d5eaf06f33b.jpg)</center>

虽然这四种形式彼此截然不同，但这种草书形状的改变与英语草书写作并没有根本的区别。

在某些情况下，两个字形可以更加根本地改变形状并合并形成单个字形。这种类型的合并字形称为 _ 连字 _。例如，大多数英文字体包含下图所示的连字 _fi_ ：

<center>![Ligature for fi](img/cdb913f0aa9fe493b4ccf81a2dd197ca.jpg)</center>

合并后的字形考虑了字母 _f_ 上的悬垂，并以自然的方式组合字符，而不是简单地让字母碰撞。

连字也用于阿拉伯语，并且必须使用一些连字;在不使用适当的结扎的情况下呈现某些字符组合是不可接受的。当用阿拉伯字符形成连字时，形状的变化比英语中的变化更为明显。例如，下图说明了两个阿拉伯字符在一起出现时如何组合成单个连字。

<center>![How two Arabic characters are combined into a single ligature when they appear together](img/a82538dfc65f2c4d8a9f6c62eb3d5497.jpg)</center>

在 Java 编程语言中，文本使用 Unicode 字符编码进行编码。使用 Unicode 字符编码的文本以 _ 逻辑顺序 _ 存储在内存中。逻辑顺序是读取和写入字符和单词的顺序。逻辑顺序不一定与 _ 视觉顺序 _ 相同，即显示相应字形的顺序。

特定书写系统（脚本）中字形的视觉顺序称为 _ 脚本顺序 _。例如，罗马文本的脚本顺序是从左到右，阿拉伯语和希伯来语的脚本顺序是从右到左。

除了用于在文本行上排列字形和单词的脚本顺序之外，一些书写系统还具有规则。例如，阿拉伯语和希伯来语数字从左向右运行，即使字母从右向左运行。这意味着即使没有嵌入英文文本，阿拉伯语和希伯来语也是真正的双向语言。有关详细信息，请参阅[使用双向文本](textlayoutbidirectionaltext.html)。

除非使用等宽字体，否则字体中的不同字符具有不同的宽度。这意味着文本的所有定位和测量都必须考虑使用哪些字符，而不仅仅是多少字符。例如，要右对齐以比例字体显示的数字列，您不能简单地使用额外的空格来定位文本。要正确对齐色谱柱，您需要知道每个数字的确切宽度，以便相应地进行调整。

文本通常使用多种字体和样式显示，例如粗体或斜体。在这种情况下，即使相同的字符也可以具有不同的形状和宽度，具体取决于它的样式。要正确定位，测量和渲染文本，您需要跟踪每个字符 _ 和 _ 应用于该字符的样式。幸运的是， [`TextLayout`](https://docs.oracle.com/javase/8/docs/api/java/awt/font/TextLayout.html) 类为你做了这个。

要正确显示希伯来语和阿拉伯语等语言的文本，需要测量每个字符并将其定位在相邻字符的上下文中。因为字符的形状和位置可以根据上下文而改变，所以在不考虑上下文的​​情况下测量和定位这样的文本会产生不可接受的结果。

此外，Java SE 为您提供 [`FontMetrics`](https://docs.oracle.com/javase/8/docs/api/java/awt/FontMetrics.html) 类，使您可以获取由 [`Font`](https://docs.oracle.com/javase/8/docs/api/java/awt/Font.html) 对象渲染的文本的度量，例如文本行的高度在字体中。您可以使用此信息在 Java 图形应用程序中精确定位文本。有关详细信息，请参阅[测量文本](measuringtext.html)。