第七章 Caché 函数大全 $CHAR 函数

第七章 Caché 函数大全 $CHAR 函数

将表达式的整数值转换为相应的ASCII或Unicode字符。

大纲

$CHAR(expression,...)
$C(expression,...)

参数

  • expression 要转换的整数值。

描述

$CHAR返回与表达式指定的十进制(基数为10)整数值相对应的字符。该字符可以是8位(ASCII)字符,也可以是16位(Unicode)字符。对于8位字符,表达式中的值必须为0到255之间的正整数。对于16位字符,请在256到65535(十六进制FFFF)之间指定整数。大于65535的值将返回一个空字符串。从65536(十六进制10000)到1114111(十六进制10FFFF)之间的值用于表示Unicode代理对。这些字符可以使用$WCHAR返回。在8位Caché安装中,$CHAR返回表达式值大于255的空字符串。

可以将表达式指定为以逗号分隔的列表,在这种情况下,$CHAR将为列表中的每个表达式返回相应的字符。

$ASCII函数是$CHAR的反函数。

参数

expression

该表达式可以是整数值,可以是包含整数值的变量的名称,也可以是计算结果为整数值的任何有效ObjectScript表达式。要返回多个整数值的字符,请指定以逗号分隔的表达式列表。

可以使用$ZHEX函数使用十六进制字符代码而不是十进制(基数为10)的字符代码来指定字符。在下面的示例中,两个$CHAR语句均返回希腊字母pi:

DHC-APP>WRITE $CHAR(960),!
π
 
DHC-APP> WRITE $CHAR($ZHEX("3C0"))
π

示例

下面的示例在FOR循环中使用$CHAR输出65至90范围内所有ASCII码的字符。这些是大写字母字符。

/// d ##class(PHA.TEST.Function).Char()
ClassMethod Char()
{
    
    
	FOR i=65:1:90 {
    
    
		WRITE !,$CHAR(i) 
	}
}
DHC-APP>d ##class(PHA.TEST.Function).Char()
 
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z

下面的示例在FOR循环中使用$CHAR输出日语平假名字符:

/// d ##class(PHA.TEST.Function).Char1()
ClassMethod Char1()
{
    
    
	IF $SYSTEM.Version.IsUnicode()  {
    
    
		FOR i = 12353 : 1 : 12435 {
    
    
			WRITE !,$CHAR(i) 
		} 
	} ELSE {
    
    
		WRITE "此示例需要Caché的Unicode版本"
	}
}

DHC-APP>d ##class(PHA.TEST.Function).Char1()
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでと                                        どなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐ                                        ゑをん

以下两个示例显示了多个表达式值的使用。第一个返回“AB”,第二个返回“AaBbCcDdEeFfGgHhIiJjKk”:

/// d ##class(PHA.TEST.Function).Char2()
ClassMethod Char2()
{
    
    
	WRITE $CHAR(65, 66),!
	FOR i = 65 : 1 : 75 {
    
     
		WRITE $CHAR(i, i + 32) 
	}
}
DHC-APP>d ##class(PHA.TEST.Function).Char2()
AB
AaBbCcDdEeFfGgHhIiJjKk

以下示例显示了多字节字符的使用。对应于整数960的字符是pi的符号:

/// d ##class(PHA.TEST.Function).Char3()
ClassMethod Char3()
{
    
    
	IF $SYSTEM.Version.IsUnicode()  {
    
    
		WRITE $CHAR(960) 
	} ELSE {
    
    
		WRITE "此示例需要Caché的Unicode版本"
	}
}

DHC-APP>d ##class(PHA.TEST.Function).Char3()
π

注意

$CHARWRITE命令

使用$CHAR通过WRITE命令写入字符时,输出字符将重置特殊变量$X$Y的位置。即使对于与空字符串(“”)不同的NULL字符(ASCII 0),也是如此。通常,在编写非打印字符时应谨慎使用$CHAR,因为此类字符可能会产生不可预测的光标位置和屏幕行为。

$CHAR%List结构

因为%List结构(%Library.List)是使用非打印字符的编码字符串,所以某些$CHAR值会导致%List结构包含单个元素。返回%List结构的$CHAR组合如下:

  • $CHAR(1)返回一个空列表:$lb()
  • $CHAR(1,1)返回一个包含两个元素的空列表$lb(,)
  • $CHAR(2,1), $CHAR(2,2), 或$CHAR(2,12) 返回包含空字符串的列表:$lb("")
  • $CHAR(2,4) 返回 $lb(0)
  • $CHAR(2,5) 返回 $lb(-1).
  • $CHAR(2,8)$CHAR(2,9)返回 $lb($double(0))

涉及两个以上字符并产生单元素列表的$CHAR组合具有以下语法:

$CHAR(count,flag,string)

Count是字符总数。例如, $CHAR(5,1,65,66,67)$CHAR(5,1)_"ABC"

Flag是一个整数,指定应如何表示字符串。有效标志值包括1、2、4、5、6、7、8、9、12和13。这些标志解释与该非打印字符的常规ASCII解释无关。

  • flag = 1flag = 12flag = 13返回文字字符串值作为列表元素。
  • flag = 2仅在count是偶数时才有效。它返回一个列表元素,其中包含一个或多个从字符串派生的宽Unicode字符,通常是一个或多个汉字。
  • flag = 4返回字符的正ASCII数字代码作为列表元素。当count> 10时,不能使用flag = 4。
  • flag = 5返回一个负整数ASCII数字代码作为列表元素。当count> 10时,不能使用flag = 5。
  • flag = 6返回一个从字符串派生的正整数作为列表元素:
    • $CHAR(3,6,n) 始终返回$lb(0)
    • 当count> 3时,$CHAR(count,6,string)返回一个(通常)从ASCII数值派生的大正整数。尾随零的数量对应于字符串中第一个字符的ASCII值,前导数字值对应于字符串中第二个字符的ASCII值。例如, $CHAR(4,6,0,7)返回 $lb(7); $CHAR(4,6,3,7) 返回 $lb(7000)
    • 当count> 11时,不能使用flag = 6
  • flag = 7返回一个从字符串派生的负整数作为列表元素:
    • $CHAR(3,7,n) 返回一个负数,其零个数对应于n的值:0 = –1,1 = –10,2 = –100,3 = –1000,等等。
    • 当count> 3时$CHAR(count,7,string)返回一个(通常)大的负整数。尾随零的数目对应于字符串中第一个字符的ASCII值。
    • 当count> 11时,不能使用flag = 7。
  • flag = 8返回$DOUBLE(x),其中x是一个小数。当count>6时,不能使用flag = 8。
  • flag = 9返回$DOUBLE(x),其中x为大数。当count>10时,不能使用flag = 9。

字符串是计数为2个字符的数字或字符串。例如,三个字符的字符串可以表示为$CHAR(5,FLAG,65,66,67)$CHAR(5,FLAG)_“ABC”。字符串值成为列表元素,其值由flag表示。

$CHAR参数中的数值

以对表达式使用带符号的数字值。Caché忽略负数,只计算正数或无符号数。在下面的示例中,带符号整数的$CHAR仅返回第一个和第三个表达式,而忽略第二个表达式,它是一个负整数。

DHC-APP>WRITE !,$CHAR(65,66,67)
 
ABC
DHC-APP> WRITE !,$CHAR(+65,-66,67)
 
AC
ABC
AC

可以对表达式使用浮点数值。Caché忽略参数的小数部分,只考虑整数部分。在下面的示例中,$CHAR忽略数字的小数部分,并生成由字符代码65(大写A)表示的字符。

DHC-APP>   WRITE $CHAR(65.5)
A

Unicode支持

在Caché的Unicode安装上,$CHAR在用十进制(以10为基)整数表示时支持Unicode字符。在8位Caché安装上,$CHAR返回大于255的整数的空字符串。

字符的Unicode值通常使用数字0-9和字母A-F以十六进制记法表示为4位数字。但是,ObjectScript语言中的标准函数通常根据ASCII代码标识字符,ASCII代码是十进制值,而不是十六进制。

因此,$CHAR函数根据输入的十进制Unicode值(而不是更标准的十六进制值)返回字符,从而支持Unicode编码。可以使用带引号的$ZHEX函数指定十六进制Unicode值,如下所示$CHAR($ZHEX("hexnum"))。还可以使用不带引号的$ZHEX将十进制数字转换为十六进制,如下所示: hexnum = $ZHEX(decnum)

代理对

$CHAR无法识别代理对。代理对用于表示某些中文字符并支持日语JIS2004标准。可以使用$WISWIDE函数确定字符串是否包含代理对。 $WCHAR函数可以识别并正确解析代理对。 $CHAR$WCHAR否则相同。但是,由于$CHAR通常比$WCHAR快,因此对于不太可能遇到代理对的所有情况,最好使用$CHAR

注意:不应将$WCHAR$ZWCHAR混淆,后者总是成对分析字符。

$CHAR相关的函数

$ASCII函数是$CHAR的反函数。可以使用它来将字符转换为其等效的数值。 $ASCII转换所有字符,包括Unicode字符。此外,所有Caché平台都支持相关功能$ZLCHAR$ZWCHAR。它们类似于$CHAR,但是对一个字(两个字节)或一个长字(四个字节)进行操作。可以使用$ZISWIDE确定$CHAR表达式中是否有任何多字节(“宽”)字符。

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/108273509