Caché 函数大全 $ASCII 函数
将字符转换为数字代码。
大纲
代码语言:javascript复制$ASCII(expression,position)
$A(expression,position)
参数
- expression 要转换的字符。
- position 可选-字符在字符串中的位置,从1开始计数。默认值为1。
描述
$ASCII
返回表达式中指定的单个字符的字符代码值。此字符可以是8位(扩展ASCII)字符或16位(Unicode)字符。返回值是一个正整数。
expression参数可以求值为单个字符或一个字符串。如果expression计算为字符串,则可以包括可选的position参数,以指示要转换的字符。
参数
expression
该表达式的结果为带引号的一个或多个字符的字符串。可以将表达式指定为变量的名称,数值,字符串文字或任何有效的CachéObjectScript表达式。如果expression产生的字符串超过一个字符,请使用position选择所需的字符。如果省略字符串的位置,则$ASCII
返回第一个字符的数字代码。如果表达式的计算结果为空字符串,则$ASCII
返回-1。
position
该位置必须指定为非零正整数。它可以是已签名或未签名的。可以在位置使用非整数数值;但是,Caché忽略小数部分,只考虑数值的整数部分。如果不包括位置,则$ASCII
返回表达式中第一个字符的数值。如果position的整数值大于表达式中的字符数或小于1,则$ASCII
返回-1。
示例
下面的示例返回87,即字符W
的ASCII数值。
DHC-APP>WRITE $ASCII("W")
87
下面的示例返回960,这是Unicode字符“pi
”的等效数字。
DHC-APP>WRITE $ASCII($CHAR(959 1))
960
下面的示例返回84,这是变量Z
中第一个字符的ASCII等效数字。
DHC-APP>SET Z="TEST"
DHC-APP>WRITE $ASCII(Z)
84
下面的示例返回83,这是变量Z
中第三个字符的ASCII数字等效项。
DHC-APP>SET Z="TEST"
DHC-APP>WRITE $ASCII(Z,3)
83
下面的示例返回-1,因为第二个参数指定的位置大于字符串中的字符数。
代码语言:javascript复制DHC-APP>SET Z="TEST"
DHC-APP>WRITE $ASCII(Z,5)
-1
下面的示例在FOR
循环中使用$ASCII
将变量x
中的所有字符转换为等效的ASCII数字。 $ASCII
参考包含position参数,该参数在每次循环执行时都会更新。当position到达的数字大于x
中的字符数时,$ASCII
将返回值-1,这将终止循环。
/// d ##class(PHA.TEST.Function).ASC2()
ClassMethod ASC2()
{
SET x = "abcdefghijklmnopqrstuvwxyz"
FOR i = 1 : 1 {
QUIT:$ASCII(x, i)=-1
WRITE !, $ASCII(x, i)
}
QUIT
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.Function).ASC2()
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
下面的示例为字符串X
生成一个简单的Checksum
。将$CHAR(CS)
与字符串连接时,新字符串的Checksum
始终为零。因此,简化了验证。
/// d ##class(PHA.TEST.Function).CXSUM()
ClassMethod CXSUM()
{
SET x = "Now is the time for all good men to come to the aid of their party"
SET CS = 0
FOR i = 1 : 1 : $LENGTH(x) {
SET CS = CS $ASCII(x, i)
WRITE !,"Checksum is:", CS
}
SET CS = 128 - CS # 128
WRITE !,"Final checksum is:", CS
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.Function).CXSUM()
Checksum is:78
Checksum is:189
Checksum is:308
Checksum is:340
Checksum is:445
Checksum is:560
Checksum is:592
Checksum is:708
Checksum is:812
Checksum is:913
Checksum is:945
Checksum is:1061
Checksum is:1166
Checksum is:1275
Checksum is:1376
Checksum is:1408
Checksum is:1510
Checksum is:1621
Checksum is:1735
Checksum is:1767
Checksum is:1864
Checksum is:1972
Checksum is:2080
Checksum is:2112
Checksum is:2215
Checksum is:2326
Checksum is:2437
Checksum is:2537
Checksum is:2569
Checksum is:2678
Checksum is:2779
Checksum is:2889
Checksum is:2921
Checksum is:3037
Checksum is:3148
Checksum is:3180
Checksum is:3279
Checksum is:3390
Checksum is:3499
Checksum is:3600
Checksum is:3632
Checksum is:3748
Checksum is:3859
Checksum is:3891
Checksum is:4007
Checksum is:4111
Checksum is:4212
Checksum is:4244
Checksum is:4341
Checksum is:4446
Checksum is:4546
Checksum is:4578
Checksum is:4689
Checksum is:4791
Checksum is:4823
Checksum is:4939
Checksum is:5043
Checksum is:5144
Checksum is:5249
Checksum is:5363
Checksum is:5395
Checksum is:5507
Checksum is:5604
Checksum is:5718
Checksum is:5834
Checksum is:5955
Final checksum is:61
下面的示例将小写或大小写混合的字母字符串转换为所有大写字母。
代码语言:javascript复制/// d ##class(PHA.TEST.Function).ASCST()
ClassMethod ASCST()
{
ST
SET String = "ThIs Is a MiXeDCAse stRiNg"
WRITE !,"Input: ",String
SET Len = $LENGTH(String), Nstring=" "
FOR i = 1 : 1 : Len { DO CNVT }
QUIT
CNVT
SET Char = $EXTRACT(String, i),Asc = $ASCII(Char)
IF Asc > 96, Asc < 123 {
SET Char = $CHAR(Asc - 32)
SET Nstring = Nstring _ Char
} ELSE {
SET Nstring = Nstring _ Char
}
WRITE !,"Output: ",Nstring
QUIT
}
代码语言:javascript复制DHC-APP>d ##class(PHA.TEST.Function).ASCST()
Input: ThIs Is a MiXeDCAse stRiNg
Output: T
Output: TH
Output: THI
Output: THIS
Output: THIS
Output: THIS I
Output: THIS IS
Output: THIS IS
Output: THIS IS A
Output: THIS IS A
Output: THIS IS A M
Output: THIS IS A MI
Output: THIS IS A MIX
Output: THIS IS A MIXE
Output: THIS IS A MIXED
Output: THIS IS A MIXEDC
Output: THIS IS A MIXEDCA
Output: THIS IS A MIXEDCAS
Output: THIS IS A MIXEDCASE
Output: THIS IS A MIXEDCASE
Output: THIS IS A MIXEDCASE S
Output: THIS IS A MIXEDCASE ST
Output: THIS IS A MIXEDCASE STR
Output: THIS IS A MIXEDCASE STRI
Output: THIS IS A MIXEDCASE STRIN
Output: THIS IS A MIXEDCASE STRING
大小写相差32
代码语言:javascript复制DHC-APP>w *70
F
DHC-APP>w *102
f
注意
支持Unicode
$ASCII
函数支持8位和16位字符。对于8位字符,它将返回数字值0到255。对于16位(Unicode)字符,它将返回最大65535的数字代码。
字符的Unicode值通常以十六进制表示为4位数字,使用数字0-9和字母A-F(分别为10到15)。但是,CachéObjectScript语言中的标准函数通常根据ASCII数字代码标识字符,ASCII数字代码是10进制的十进制值,而不是十六进制。
代码语言:javascript复制DHC-APP>w $ascii("姚鑫")
23002
DHC-APP>w $ascii("姚鑫",2)
37995
代码语言:javascript复制DHC-APP>w *23002
姚
DHC-APP>w *37995
鑫
因此,$ASCII
函数通过返回输入字符的十进制Unicode值而不是Unicode标准推荐的十六进制值来支持Unicode编码。这样,该功能保持向后兼容,同时还支持Unicode。要将十进制数转换为十六进制,请使用$ZHEX
函数。
DHC-APP>w $zhex(23002)
59DA
DHC-APP>w $zhex(37995)
946B
代码语言:javascript复制u59DA
u946B
代理对
$ASCII
无法识别代理对。代理对是一对16位Unicode字符,它们一起编码一个表意字符。代理对用于表示某些中文字符并支持日语JIS2004标准。可以使用$WISWIDE
函数确定字符串是否包含代理对。 $WASCII
函数可以识别并正确解析代理对。 $ASCII
和$WASCII
否则相同。但是,由于$ASCII
通常比$WASCII
快,因此$ASCII
对于不太可能遇到代理对的所有情况都是可取的。
注意:$WASCII
不应与$ZWASCII
混淆,$ZWASCII
总是成对解析字符。
在UTF-16中被编码为一对16比特长的码元(即32位,4字节),称作代理对(Surrogate Pair),
相关函数
$CHAR
函数是$ASCII
的反函数。可以使用它将整数代码转换为字符。
DHC-APP>w $char(23002)
姚
DHC-APP>w $char(37995)
鑫
$ASCII
将单个字符转换为整数。要将16位(宽)字符串转换为整数,请使用$ZWASCII
。要将32位(长)字符串转换为整数,请使用$ZLASCII
。若要将64位(四进制)字符串转换为整数,请使用$ZQASCII
。要将64位字符串转换为IEEE浮点数($DOUBLE
数据类型),请使用$ZDASCII
。
$ZWASCII
双字节
DHC-APP>w $ZWASCII("姚鑫")
50394
DHC-APP>w $ZWASCII("姚鑫",2)
-1
$ZWASCII
四字节
DHC-APP>w $ZLASCII("姚鑫")
-1
DHC-APP>w $ZLASCII("姚鑫啊")
-1
DHC-APP>w $ZLASCII("姚鑫啊啊")
2682176730
DHC-APP>w $ZLASCII("姚鑫啊啊",2)
-1
$ZWASCII
八字节
DHC-APP>w $ZQASCII("姚鑫")
W $ZQASCII("姚鑫")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊")
W $ZQASCII("姚鑫啊")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊啊")
W $ZQASCII("姚鑫啊啊")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊啊啊")
W $ZQASCII("姚鑫啊啊啊")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊啊啊啊")
W $ZQASCII("姚鑫啊啊啊啊")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊啊啊啊啊")
W $ZQASCII("姚鑫啊啊啊啊啊")
^
<FUNCTION>
DHC-APP>w $ZQASCII("姚鑫啊啊啊啊啊啊")
-6944656957523442470