scriptItemize 函数 (usp10.h)

将 Unicode 字符串拆分为可单独调整的项。

语法

HRESULT ScriptItemize(
  [in]           const WCHAR          *pwcInChars,
  [in]           int                  cInChars,
  [in]           int                  cMaxItems,
  [in, optional] const SCRIPT_CONTROL *psControl,
  [in, optional] const SCRIPT_STATE   *psState,
  [out]          SCRIPT_ITEM          *pItems,
  [out]          int                  *pcItems
);

参数

[in] pwcInChars

指向要逐项化的 Unicode 字符串的指针。

[in] cInChars

pwcInChars 中要逐项的字符数。

[in] cMaxItems

定义要处理的项 的最大SCRIPT_ITEM 结构数。

[in, optional] psControl

指向 SCRIPT_CONTROL 结构的指针,该结构指示要执行的明细类型。

或者,如果不需要SCRIPT_CONTROL属性,应用程序可以将此参数设置为 NULL。 有关详细信息,请参见“备注”部分。

[in, optional] psState

指向指示初始双向算法状态 的SCRIPT_STATE 结构的指针。

或者,如果不需要脚本状态,应用程序可以将此参数设置为 NULL 。 有关详细信息,请参见“备注”部分。

[out] pItems

指向缓冲区的指针,函数在其中检索表示已处理的项 SCRIPT_ITEM 结构。 缓冲区的长度应为 (cMaxItems + 1) * sizeof(SCRIPT_ITEM) 字节。 使用缓冲区调用此函数以容纳少于两个SCRIPT_ITEM结构是无效 。 函数始终将终端项添加到项分析数组,以便具有从零开始的索引“i”的项的长度始终可用为:

pItems[i+1].iCharPos - pItems[i].iCharPos;

[out] pcItems

指向已处理的 SCRIPT_ITEM 结构数的指针。

返回值

如果成功,则返回 0。 如果函数不成功,则返回非零 HRESULT 值。

如果 pwcInChars 设置为 NULLcInChars 为 0、 pItems 设置为 NULLcMaxItems< 2,则该函数将返回E_INVALIDARG。

如果 cMaxItems 的值不足,函数将返回E_OUTOFMEMORY。 与所有错误情况一样,不会完全处理任何项,并且输出数组中没有任何部分包含定义的值。 如果函数返回E_OUTOFMEMORY,则应用程序可以使用更大的 pItems 缓冲区再次调用它。

注解

有关通常调用此函数的上下文的讨论,请参阅 使用 Uniscribe 显示文本

函数通过调整引擎的更改或方向的更改来分隔项。

应用程序可以从 ScriptItemize 检索的每个SCRIPT_ITEM结构中创建多个范围或完全位于单个项中的运行。 但是,它不应将多个项合并到单个运行中。 稍后,在测量或呈现时,应用程序可以针对每次运行调用 ScriptShape,并且必须传递 scriptItemizeSCRIPT_ITEM 结构中检索到的SCRIPT_ANALYSIS结构。

如果应用程序处理的文本可以包含任何从右到左的内容,则应用程序在调用 ScriptItemize 时使用 psControlpsState 参数。 但是,应用程序不必执行此操作,并且可以处理双向文本本身,而不是依赖 Uniscribe 执行此操作。 psControlpsState 参数在某些严格从左到右的方案中很有用,例如,当 SCRIPT_CONTROLfLinkStringBefore 成员不特定于从右到左的脚本时。 应用程序将 psControlpsState 设置为 NULL ,以便 ScriptItemize 完全按字符代码中断 Unicode 字符串。

应用程序可以将所有参数设置为非 NULL 值,使函数执行完整的 Unicode 双向分析。 若要允许正确的 Unicode 双向分析,应根据段落开头的读取顺序初始化 SCRIPT_STATE 结构,并且应在整个段落中传递 ScriptItemize 。 具体而言, uBidiLevel 成员应从左到右初始化为 0,从右到左初始化为 1。

SCRIPT_ITEM enabled=“1”中引用了 SCRIPT_ANALYSISfRTL 成员。 SCRIPT_PROPERTIESfNumeric 成员由 ScriptGetProperties 检索。 这些成员共同提供与 GCP_RESULTSlpClass 成员相同的分类,由 GetCharacterPlacement 中的 lpResults 引用。

欧洲数字 U+0030 到 U+0039 可以呈现为国家/地区数字,如下表所示。

SCRIPT_STATE.fDigitSubstitute SCRIPT_CONTROL.fContextDigits 为 Unicode U+0030 到 U+0039 显示的数字形状
FALSE 任意 欧洲数字
TRUE FALSE SCRIPT_CONTROLuDefaultLanguage 成员中指定。
TRUE TRUE 与之前的强文本一样,默认为 SCRIPT_CONTROLuDefaultLanguage 成员。
 

在上下文数字模式下,将发生以下操作之一:

  • 如果 uDefaultLanguage 指定的脚本与输出方向相同,则第一个字母之前遇到的所有数字都以 uDefaultLanguage 指示的语言呈现。
  • 如果 uDefaultLanguage 指定的脚本与输出方向相反,则第一个字母之前遇到的所有数字都以欧洲数字呈现。
例如,如果 uDefaultLanguage 指示LANG_ARABIC,则从右到左嵌入 Arabic-Indic 初始数字。 但是,它们采用从左到右嵌入的欧洲数字。

有关详细信息,请参阅 数字形状

下表提供了 Unicode 控制字符和定义,以及它们对 SCRIPT_STATE 成员的影响。 有关 Unicode 控制字符的详细信息,请参阅 Unicode 标准

Unicode 控制字符 含义 对SCRIPT_STATE的影响
NADS 使用国家/地区数字形状替代欧洲数字 (NODS) 。 设置 fDigitSubstitute
点头 使用名义数字形状,也称为欧洲数字。 请参阅 NADS。 清除 fDigitSubstitute
屁股 激活对称对的交换,例如括号。 对于这些字符,左侧和右侧解释为左和右。 这是默认值。 请参阅 ISS。 清除 fInhibitSymSwap
ISS 禁止交换对称对。 请参阅 ASS。 设置 fInhibitSymSwap
AAFS 为阿拉伯语表示形式激活阿拉伯语窗体形状。 请参阅 IAFS。 设置 fCharShape
IAFS 禁止阿拉伯语表示形式,即连字和草书连接,用于阿拉伯语表示形式。 名义阿拉伯字符不受影响。 这是默认值。 请参阅 AAFS。 清除 fCharShape
 

SCRIPT_STATEfArabicNumContext 成员支持在阿拉伯语脚本文本中区分上下文显示数字。 它指示数字是使用本机阿拉伯语脚本数字形状还是欧洲数字呈现。 在段落开头,对于阿拉伯语区域设置,此成员通常应初始化为 TRUE ,对于任何其他区域设置,应初始化为 FALSE 。 函数在处理强文本时更新脚本状态。

重要从 Windows 8 开始:若要保持在 Windows 7 上运行的能力,使用 Uniscribe 的模块必须在其库列表中指定 gdi32.lib 之前的 Usp10.lib。
 

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 usp10.h
Library Usp10.lib
DLL Usp10.dll
可再发行组件 Windows Me/98/95 上的 Internet Explorer 5 或更高版本

另请参阅

使用 Uniscribe 显示文本

SCRIPT_ANALYSIS

SCRIPT_CONTROL

SCRIPT_ITEM

SCRIPT_PROPERTIES

SCRIPT_STATE

ScriptItemizeOpenType

ScriptShape

Uniscribe

Uniscribe 函数