第九十九章 Caché 函数大全 $ZCONVERT 函数 第九十九章 Caché 函数大全 $ZCONVERT 函数 大纲 描述 示例

第九十九章 Caché 函数大全 $ZCONVERT 函数

字符串转换功能。

大纲

$ZCONVERT(string,mode,trantable,handle)
$ZCVT(string,mode,trantable,handle)

参数

  • string 要转换的字符串,指定为带引号的字符串。该字符串可以指定为值,变量或表达式。
  • mode 一个字母代码,指定转换模式,即大小写转换类型或输入/输出编码。将模式指定为带引号的字符串。
  • trantable 可选-要使用的转换表,指定为整数或带引号的字符串,
  • handle 可选-包含字符串值的未下标的局部变量。用于$ZCONVERT的多次调用。 handle参数包含$ZCONVERT末尾无法转换的字符串的剩余部分,并将此剩余部分提供给$ZCONVERT的下一次调用。

描述

$ZCONVERT将字符串从一种形式转换为另一种形式。转换的性质取决于使用的参数。

$ZCONVERT返回转换后的字符串

$ZCONVERT(string,mode)返回具有由mode指定转换的字符的字符串。转换有两种类型:

  • 大小写转换
  • 编码转换

大小写转换会更改字符串中每个字母字符的大小写。可以将字符串中的所有字母字符更改为小写,大写或标题大写形式。可以将字符串中的单词或句子的首字母更改为大写形式。字符串中已经存在指定大小写的字符和没有大小写的字符(通常是任何非字母字符)都将原样传递。要在字符串中输出文字引号(“”),请输入两个引号(“”)。

编码转换在系统上使用的内部编码样式和另一种编码样式之间转换字符串。可以执行输入转换;也就是说,将字符串从外部编码样式转换为系统的编码样式。还可以执行输出转换;也就是说,将字符串从系统的编码样式转换为外部编码样式。

可以用于模式的值如下:

Code Desc
U or u 大写转换:将字符串中的所有字符转换为大写。
L or l 小写转换:将字符串中的所有字符转换为小写。
T or t 标题大小写转换:将字符串中的所有字符转换为标题大小写。标题大小写仅对字母具有三种形式的那些字母(主要是东欧)有意义:大写,小写和标题大写。对于所有其他字母,标题大写转换与大写转换相同。
W or w 单词转换:将字符串中每个单词的第一个字符转换为大写。前面有空格、引号(\“)、撇号()或左圆括号(()的任何字符都被视为单词的第一个字符。单词转换会将所有其他字符转换为小写。单词转换是特定于区域设置的;对于其他语言区域设置,上述英语语法规则可能会有所不同。
S or s 句子转换:将字符串中每个句子的第一个字符转换为大写。字符串的第一个非空白字符,以及前面有句点(.)、问号()或感叹号()的任何字符。被认为是句子的第一个字。(忽略前面的标点符号和字母之间的空格。)。如果此字符是字母,则会转换为大写。句子转换将所有其他字母字符转换为小写。句子转换是特定于区域设置的;对于其他语言区域设置,上述英语语法规则可能会有所不同。
I or i 对指定的字符串执行输入编码转换。对于两参数形式,将使用当前进程I / O转换句柄执行转换。如果尚未定义当前进程I / O转换句柄,则Caché将基于默认进程I / O转换表名称执行转换。
O or o 对指定的字符串执行输出编码转换。对于两参数形式,将使用当前进程I / O转换句柄执行转换。如果尚未定义当前进程I / O转换句柄,则Caché将基于默认进程I / O转换表名称执行转换。

如果mode为空字符串或有效字符以外的任何值,则会收到<FUNCTION>错误。

字母大小写转换

可以将字符串中的字母全部转换为大写字母或全部小写字母。转换适用于Unicode字母和ASCII字母。下面的示例将希腊字母表从小写转换为大写:

DHC-APP>FOR i=945:1:969 {WRITE $ZCONVERT($CHAR(i),"U")}
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩ

然而,少数字母只有小写字母形式。例如,德语eszett($char(223))仅定义为小写字母。尝试将其转换为大写字母会得到相同的小写字母:

/// d ##class(PHA.TEST.Function).ZCONVERT()
ClassMethod ZCONVERT()
{
    IF $ZCONVERT($CHAR(223),"U")=$ZCONVERT($CHAR(223),"L") {
        WRITE "大写字母和小写字母相同" 
    } ELSE {
        WRITE "大写字母和小写字母不同" 
    }
}
DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT()
大写字母和小写字母相同

因此,在将字母数字字符串转换为单字母大小写时,最好转换为小写。

可以使用$Translate函数执行类似的字母大小写转换,如下例所示:

DHC-APP>WRITE $TRANSLATE("1A2C5V76D88J5aN","ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")
1a2c5v76d88j5an

词句转换

“W”“S”模式确定非空白字符是单词的第一个字符还是句子的第一个字符,如果该字符是字母,则将其转换为大写。所有其他字母都被转换成小写。大小写转换适用于任何字母表中的字母,如以下转换希腊字母的示例所示($Char(945)为小写字母,$Char(913)为大写字母):

DHC-APP>SET greek=$CHAR(945,946,947,913,914,915)
 
DHC-APP>WRITE $ZCONVERT(greek,"W")
Αβγαβγ

然而,确定什么构成单词或句子的规则取决于地区。例如,下面的示例使用西班牙语反转感叹号$Char(161)。默认(英语)区域设置不会将此字符识别为句子或单词的开头。在此示例中,西班牙语的所有字母都被转换为小写:

/// d ##class(PHA.TEST.Function).ZCONVERT1()
ClassMethod ZCONVERT1()
{
    SET spanish=$CHAR(161)_"ola MuNdO! "_$CHAR(161)_"olA!"
    SET english="hElLo wOrLd! heLLo!"
    WRITE !,$ZCONVERT(english,"S")
    WRITE !,$ZCONVERT(spanish,"S")
}
DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT1()
 
Hello world! Hello!
??ola mundo! ??ola!

标题转换

Titlecase(“T”)模式将字符串中的每个字母转换为其标题格式。 Titlecase不会根据字母在单词或字符串中的位置选择性地将字母大写。标题大小写是标题中单词的第一个字符时表示字母的情况。对于标准拉丁字母,标题大小写形式与大写形式相同。

某些语言(例如,克罗地亚语)通过两个字母标志符号表示特定的字母。例如,“lj”是克罗地亚语字母中的单个字母。该字母具有三种形式:小写字母“lj”,大写字母“LJ”和标题字母“Lj”$ZCONVERT标题大小写转换用于这种类型的字母转换。

三参数形式:编码转换

$ZCONVERT(string,mode,trantable)对字符串执行输入编码转换或输出编码转换。在三参数形式中,可以使用的模式值为“I”或“O”。必须定义模式值。对于“I”转换,字符串可以是十六进制字符串,例如%4B(字母“K”);十六进制字符串不区分大小写。

4B = 75

DHC-APP>w $char(75)
K

DHC-APP>w $zhex(75)
4B

可以使用ZZDUMP来显示字符串的十六进制编码。可以使用$CHAR通过十进制(以10为底)的编码来指定一个字符(或字符串)。可以使用$ZHEX将十六进制数转换为十进制数,或将十进制数转换为十六进制数。如果转换后的值是非打印字符,则Caché会将其显示为空字符串。如果目标设备不能表示翻译的字符,则Caché会用问号()字符代替不可显示的字符。

可转换值可以是数字字符或指定要使用的转换表或转换句柄的字符串。可转换值可以是:

  • “RAW”不对8位字符或16位Latin-1字符(Unicode字符,其中高位字节的值为00)不进行转换。 RAW转换不应用于使用非拉丁1区域设置(例如rusw)的InterSystems IRIS系统。

  • “SAME”将8位字符转换为相应的Unicode字符。

  • “HTML”在字符串中添加(输出模式)或除去(输入模式)HTML转义字符。

  • “JS”(或“JSML”),它使用提供的JavaScript转换表转义字符串中的字符,以便在JavaScript中使用。有关输出转换,请参见下表。有关JS和JSML的比较,请参见JS和JSML、JSON和JSONML转换。对于输入翻译,“\0”“\000”“\x00”“\u0000”都是NULL的有效转义序列。

  • “JSON”(或“JSONML”),它使用提供的转换表将其转换为JSON格式。有关输出转换,请参见下表。有关JSON和JSONML的比较,请参见JS和JSML、JSON和JSONML转换。对于输入转换,“\0”“\000”“\x00”“\u0000”都是NULL的有效转义序列。

  • “URL”向字符串添加(输出模式)或移除(输入模式)URL参数转义字符。URL对字符进行编码:?#[]@+,;=~:%3A%3F%23%5B%5D%40%2B%2C%3B%3D%7E。大于$CHAR(255)的字符以Unicode十六进制表示法表示:$CHAR(256)=%u0100

  • “UTF8”(UTF-8编码),将16位Unicode字符转换为一系列8位字符(输出模式)。ASCII 16位Unicode字符将转换为单个8位字符;例如,十六进制0041(字母“A”)将转换为8位字符十六进制41。非ASCII Unicode字符将转换为两个或三个8位字符。Unicode十六进制0080到07FF转换为两个8位字符;其中包括拉丁语-1补充字符和拉丁语扩展字符以及希腊语、西里尔语、希伯来语和阿拉伯字母。Unicode十六进制0800到FFFF转换为三个8位字符;这些字符构成Unicode Basic多语言平面的其余部分。因此,在RAW和UTF8模式下,ASCII字符$CHAR(0)$CHAR(127)是相同的;字符$CHAR(128)和更高版本被转换。输入模式与此转换相反。

  • “XML”向字符串添加(输出模式)或移除(输入模式)XML转义字符。

以下是输出模式转义字符的表格:

字符 HTML JS JSON URL XML
null $CHAR(0) \x00 \u0000 %00
$CHAR(1)$CHAR(7) \x01 到 \x07 \u0001 到 \u0007 %01 到 %07
退格 $CHAR(8) \b \b %08
水平制表符 $CHAR(9) \t \t %09
换行 $CHAR(10) \n \n %0A
垂直制表符 $CHAR(11) \v \u000B %0B
换页 $CHAR(12) \f \f %0C
回车 $CHAR(13) \r \r %0D
$CHAR(14)$CHAR(31) \u000E 到 \u001F %0E 到 %1F
$CHAR(32) %20
" (doubled) &quot; \" \" %22 &quot;
# %23
% %25
& &amp; %26 &amp;
‘ (apostrophe) $CHAR(39) &#39; &apos;
+ %2B
, %2C
/ (slash) $CHAR(47) \/
: %3A
; %3B
< &lt; %3C &lt;
= %3D
> &gt; %3E &gt;
? %3F
@ %40
[ %5B
\ \\ \\ %5C
] %5D
^ %5E
%60
{ %7B
%7C
} %7D
~ %7E
$CHAR(127)$CHAR(159) %7F 到 %9F
$CHAR(160) &nbsp; %A0
$CHAR(161)$CHAR(255) %A1 到 %FF

URL转换

URL只能包含某些8位ASCII字符。所有其他字符必须用以%开头的转义序列表示。如果要将包含Unicode字符的字符串转换为URL,则必须首先使用UTF8编码将本地表示形式转换为8位中间表示形式。然后将UTF8结果转换为URL编码。要将URL转换回其原始Unicode字符串,请执行相反的操作。下面的示例显示了这一点:

/// d ##class(PHA.TEST.Function).ZCONVERT2()
ClassMethod ZCONVERT2()
{
    IF $SYSTEM.Version.IsUnicode() {
        SET ustring="US$ to "_$CHAR(8364)_" échange"
        WRITE "初始字符串为: ",ustring,!
ConvertUnicodeToURL
        SET utfo = $ZCONVERT(ustring,"O","UTF8")
        SET urlo = $ZCONVERT(utfo,"O","URL")
        WRITE "Unicode到URL的转换: ",urlo,!
ConvertURLtoUnicode
        SET urli = $ZCONVERT(urlo,"I","URL")
        SET utfi = $ZCONVERT(urli,"I","UTF8")
        WRITE "URL到Unicode的转换: ",utfi
    } ELSE {
        WRITE "此示例需要安装Unicode的Caché"
    }
}
DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT2()
初始字符串为: US$ to  échange
Unicode到URL的转换: US$%20to%20%E2%82%AC%20%C3%A9change
URL到Unicode的转换: US$ to  échange

JS和JSML、JSON和JSONML转换

JS和JSON转换对Unicode字符使用UTF-8编码。JSML和JSONML转换在没有编码的情况下呈现Unicode字符。对于ASCII字符($CHAR(0)$CHAR(127)),JS和JSML编码是相同的。对于ASCII字符($CHAR(0)$CHAR(127)),JSON和JSONML编码是相同的。

下面的示例比较JS和JSML字符的转换:

/// d ##class(PHA.TEST.Function).ZCONVERT3()
ClassMethod ZCONVERT3()
{
    FOR i=1:1:256 {
        SET x=$ZCVT($C(i),"O","JS") 
        SET y=$ZCVT($C(i),"O","JSML") 
        IF x=y {
            WRITE "."
        } ELSE {
            WRITE !!,$ZHEX(i),!,"JS: " ZZDUMP x WRITE !,"JSML: " ZZDUMP y 
        }
    }
}

DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT3()
...............................................................................................................................
 
80
JS:
0000: 80                                                      .
JSML:
0000: C2 80                                                   ??.
 
81
JS:
0000: 81                                                      .
JSML:
0000: C2 81                                                   ??.
 
82
JS:
0000: 82                                                      .
JSML:
0000: C2 82                                                   ??.
 
83
JS:
0000: 83                                                      .
JSML:
0000: C2 83                                                   ??.
 
84
JS:
0000: 84                                                      .
JSML:
0000: C2 84                                                   ??.
 
85
JS:
0000: 85                                                      .
JSML:
0000: C2 85                                                   ??.
...

四参数形式:输入/输出字符串

handle参数是$ZCONVERT在执行开始时读取并在完成执行时写入的局部变量。它用于保存$ZCONVERT函数的连续调用之间的信息。它可以用于两个目的:将字符串连接到字符串的开头,以及转换非常长的字符串。

要将字符串连接到字符串的开头,请在调用$ZCONVERT之前设置句柄:

/// d ##class(PHA.TEST.Function).ZCONVERT4()
ClassMethod ZCONVERT4()
{
    SET handle="the "
    WRITE $ZCVT("quick brown fox","O","URL",handle),!
    /*  the%20quick%20brown%20fox  */
    WRITE $ZCVT("quick brown fox","O","URL",handle),!
    /*  quick%20brown%20fox  */
}

DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT4()
the%20quick%20brown%20fox
quick%20brown%20fox

请注意,$ZCONVERT完成执行后会重置句柄。在前面的示例中,它将句柄重置为空字符串。

此句柄参数可用于输入转换。在处理部分字符集(如流读取)时,在处理多字节字符序列时,指定句柄非常有用。在这些情况下,$ZCONVERT使用HANDLE参数保存可能是多字节序列的前导字节的部分字符序列。如果$ZCONVERT结尾处缓冲区中的输入字符不能构成完整的转换单元,则这些剩余字符将在句柄中返回。在下一个$ZCONVERT的开头,如果句柄包含数据,这些剩余的字符将被放在正常输入数据的前面。这对于在UTF8转换中使用尤其有用,如下例所示:

SET handle=""
WHILE 'stream.AtEnd() {
    WRITE $ZCONVERT(stream.Read(20000),"I","UTF8",handle)
} 

要转换超长字符串,可能需要多次调用$ZCONVERT来执行多个字符串转换。$ZCONVERT提供了可选的句柄参数来保存字符串的剩余未转换部分。如果指定句柄参数,则每次调用$ZCONVERT都会更新该参数。当字符串转换完成时,$ZCONVERT将句柄设置为空字符串。

    SET handle=""
    SET out = $ZCVT(hugestring,"O","HTML",handle)
    IF handle '= "" {
    SET out2 = $ZCVT(handle,"O","HTML",handle)
        WRITE "Converted string is: ",out,out2  }
    ELSE {
        WRITE "Converted string is: ",out }

示例

下面的示例返回“HELLO”:

DHC-APP>WRITE $ZCONVERT("Hello","U")
HELLO

以下示例返回“hello”:

DHC-APP>WRITE $ZCVT("Hello","L")
hello

下面的示例返回“HELLO”:

DHC-APP>WRITE $ZCVT("Hello","T")
HELLO

下面的示例使用连接运算符(_)附加并区分大小写转换一个重音字符:

DHC-APP>WRITE "CACH"_$CHAR(201),!, $ZCVT("CACH"_$CHAR(201),"L")
CACH??
caché

以下示例将字符串中的尖括号转换为HTML转义字符进行输出,返回“&lt;TAG&gt;”

DHC-APP> WRITE $ZCVT("<TAG>","O","HTML")
&lt;TAG&gt;

注意,这些尖括号的显示方式取决于输出设备;试着在这里运行这个程序,然后从终端提示符运行它。

下面的示例显示$ZCONVERT如何替代a?无法显示的翻译字符。在此示例中,UTF8和当前进程I / O转换对象(可转换0)的转换都显示$CHAR(63),这是实际值吗?字符。 UTF8无法显示$CHAR(127)以上的转换字符。转换表0无法显示$CHAR(255)以上的转换字符:

/// d ##class(PHA.TEST.Function).ZCONVERT5()
ClassMethod ZCONVERT5()
{
    FOR i=1:1:300 {
        IF $ZCONVERT($CHAR(i),"I","UTF8") '= "?" { 
            CONTINUE 
        } ELSE {
            WRITE "UTF8 ",i,"=",$ZCONVERT($CHAR(i),"I","UTF8")
        }
        IF $ZCONVERT($CHAR(i),"I",0)="?" {
            WRITE " trantable 0 ",i,"=",$ZCONVERT($CHAR(i),"I",0),!
        } ELSE {
            WRITE !
        }
    }
}
DHC-APP>d ##class(PHA.TEST.Function).ZCONVERT5()
UTF8 63=? trantable 0 63=?
UTF8 128=? trantable 0 128=?
UTF8 129=? trantable 0 129=?
UTF8 130=? trantable 0 130=?
UTF8 131=? trantable 0 131=?
UTF8 132=? trantable 0 132=?
UTF8 133=? trantable 0 133=?
UTF8 134=? trantable 0 134=?
UTF8 135=? trantable 0 135=?
UTF8 136=? trantable 0 136=?
UTF8 137=? trantable 0 137=?
UTF8 138=? trantable 0 138=?
UTF8 139=? trantable 0 139=?
UTF8 140=? trantable 0 140=?
UTF8 141=? trantable 0 141=?
UTF8 142=? trantable 0 142=?
UTF8 143=? trantable 0 143=?
UTF8 144=? trantable 0 144=?
UTF8 145=? trantable 0 145=?
UTF8 146=? trantable 0 146=?
UTF8 147=? trantable 0 147=?
UTF8 148=? trantable 0 148=?
UTF8 149=? trantable 0 149=?
UTF8 150=? trantable 0 150=?
UTF8 151=? trantable 0 151=?
UTF8 152=? trantable 0 152=?
UTF8 153=? trantable 0 153=?
...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章