第三章 使用系统类提供国家语言支持 - %SYS.NLS.Table
%SYS.NLS.Table
%SYS.NLS.Table
类可以实例化反映各种表类别的系统默认设置或当前进程设置的对象。表是基本的 NLS
机制,它允许应用程序数据被接受为输入、排序并以适合指定区域设置的格式显示。与 %SYS.NLS.Locale
一样,更改系统对象的任何属性都不会影响系统。但是,更改流程对象的属性将导致关联的行为立即更改。
NLS
表可以分为 I/O
表和内部表。每种表类型都有自己的一组相关数据:
I/O Tables
这些表在系统运行的当前语言环境支持的基本底层字符集和 IRIS
之外的某个实体支持的外部字符集之间进行转换。例如,语言环境字符集可能是 Latin2
(更恰当地称为 ISO 8859-2
),而外部字符集可能是 UTF-8
,通常用于与终端通信。因此,在输出上,将使用像 Latin2–to-UTF8
这样的表,而在输入上,将需要一个反向映射表,UTF8–to-Latin2
。
虽然这里涉及到两个表(一个用于输入,另一个用于输出),但这些表通常是相互补充的。为简单起见,在谈到语言环境定义和系统默认值时, IRIS
对一对 I/O
表使用一个名称。这个名字通常是外来字符集的名字,默认的另一半是locale
字符集。但是,在创建自定义表时,可以选择任何传达交易所含义的名称。
I/O
表用于设备;在这种情况下,设备一词指的是 IRIS
与外部世界接触并需要转换的任何接口,包括进程和系统调用接口。
- Terminal
- Other terminal connections
- External files
- TCP/IP connections
- Printer
- IRIS processes
- System call
Internal Tables
内部表还将当前本地字符集中的字符串映射到某个其他值,但它们并不打算用于与外部世界的通信。内部表标识属于以下部分的字符:
-
Pattern matching
识别匹配特定模式代码(如字母、数字、标点符号等)的字符。
-
Identifiers
标识符表指示哪些字符可以在标识符中使用。
-
标题中使用大写字母、小写字母和大写字母。
这些在结构上类似于
I/O
表;它们从一个字符集映射到另一个恰好是同一组的字符集。但是,它们在$ZCONVERT()
的上下文中使用,而不是与某些I/O
操作一起使用。 -
Collation ordering
这些表将一个字符串映射到适合在
Global
下标中使用的该字符串的内部表示。不同的语言对于单词应该如何按字典顺序整理有不同的规则;这些规则封装在一个整理表中。 -
$X/$Y action
这些表将字符映射为值,指示它们如何与
$X
和$Y
特殊变量交互。在输出这个字符后$X
和/或$Y
是否应该递增?字符可以打印吗?这些是$X/$Y
表可以回答的问题。
使用 %SYS.NLS
的示例
重要提示:这些示例都是可执行的,但没有一个有 RunIt
按钮,因为它们操纵当前语言环境的进程默认值。此外,许多都需要管理权限和/或对 %SYS
命名空间的写入权限。如果希望执行它们,请在单独的进程中运行它们,例如 终端工具 (Windows
),或通过 TCP/IP
连接,并使用适当的权限。
Set Info = ##class(%SYS.NLS.Locale).%New()
Set Items = "Name" _
"/Description" _
"/Country" _
"/CountryAbbr" _
"/Language" _
"/LanguageAbbr" _
"/Currency" _
"/CharacterSet"
Write !
For i = 1 : 1 : $LENGTH(Items, "/")
{
Set Item = $PIECE(Items, "/", i)
Write $JUSTIFY(Item, 15),": ", $PROPERTY(Info, Item), !
}
显示系统和进程表数据
这应该为系统和进程表显示相同的值,除非在运行此示例之前某些属性已从外部更改。
Set IOTables = "Process" _
"/IRISTerminal" _
"/OtherTerminal" _
"/File" _
"/TCPIP" _
"/SystemCall" _
"/Printer"
Set IntTables = "PatternMatch" _
"/Identifier" _
"/Uppercase" _
"/Lowercase" _
"/Titlecase" _
"/Collation" _
"/XYAction"
// iterate over the systems, and then the process data
For Type = "System", "Process"
{
Write !
Set Table = ##class(%SYS.NLS.Table).%New(Type)
Write "Type: ", Type, !
Write "I/O Tables", !
For i = 1 : 1 : $LENGTH(IOTables, "/")
{
Set PropName = $PIECE(IOTables, "/", i)
Write $JUSTIFY(PropName, 15), ": ", $PROPERTY(Table, PropName), !
}
Write "Internal Tables", !
For i = 1 : 1 : $LENGTH(IntTables, "/")
{
Set PropName = $PIECE(IntTables, "/", i)
Write $JUSTIFY(PropName, 15), ": ", $PROPERTY(Table, PropName), !
}
}
网友评论