Caché 函数大全 $ASCII 函数

2022-05-09 17:28:10 浏览数 (1)

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数值。

代码语言:javascript复制
DHC-APP>WRITE $ASCII("W")
87

下面的示例返回960,这是Unicode字符“pi”的等效数字。

代码语言:javascript复制
DHC-APP>WRITE $ASCII($CHAR(959 1))
960

下面的示例返回84,这是变量Z中第一个字符的ASCII等效数字。

代码语言:javascript复制
DHC-APP>SET Z="TEST"
 
DHC-APP>WRITE $ASCII(Z)
84

下面的示例返回83,这是变量Z中第三个字符的ASCII数字等效项。

代码语言:javascript复制
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,这将终止循环。

代码语言:javascript复制
/// 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始终为零。因此,简化了验证。

代码语言:javascript复制
/// 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函数。

代码语言:javascript复制
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的反函数。可以使用它将整数代码转换为字符。

代码语言:javascript复制
DHC-APP>w $char(23002)
姚
DHC-APP>w $char(37995)
鑫

$ASCII将单个字符转换为整数。要将16位(宽)字符串转换为整数,请使用$ZWASCII。要将32位(长)字符串转换为整数,请使用$ZLASCII。若要将64位(四进制)字符串转换为整数,请使用$ZQASCII。要将64位字符串转换为IEEE浮点数($DOUBLE数据类型),请使用$ZDASCII

$ZWASCII 双字节

代码语言:javascript复制
DHC-APP>w $ZWASCII("姚鑫")
50394
DHC-APP>w $ZWASCII("姚鑫",2)
-1

$ZWASCII 四字节

代码语言:javascript复制
DHC-APP>w $ZLASCII("姚鑫")
-1
DHC-APP>w $ZLASCII("姚鑫啊")
-1
DHC-APP>w $ZLASCII("姚鑫啊啊")
2682176730
DHC-APP>w $ZLASCII("姚鑫啊啊",2)
-1

$ZWASCII 八字节

代码语言:javascript复制
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

0 人点赞