第123章 Caché 函数大全 $ZWUNPACK,$ZWBUNPACK函数
将单个16位字符解压缩为两个8位字符。
大纲
$ZWUNPACK(string)
$ZWBUNPACK(string)
参数
- string 由一个或多个16位字符组成的字符串。
描述
$ZWUNPACK是一个函数,该函数接受一个或多个两字节宽的字符并对其进行“解压缩”,并以小端顺序返回相应的单字节字符对。
$ZWBUNPACK执行相同的任务,但两字节宽的字符按大端顺序解压缩。
打包字符串是一种将字符串的字符数减半以进行存储和字符串处理的方法。解压缩将恢复原始的8位字符串以供显示。当数据中允许使用Unicode字符时,不应使用这些操作。
输入字符串应完全由使用$ZWPACK或$ZWBPACK创建的16位宽字符组成。空字符串是允许的,并返回空字符串。字符串不应包含任何16位Unicode字符或任何8位字符。
可以对字符串使用$ZISWIDE来检查它是否包含多字节字符。但是,必须在每个字符上使用$ZISWIDE以确保字符串不包含16位和8位字符的混合。 $ZISWIDE不区分Unicode和压缩的16位字符。
示例
请注意,以下示例需要Caché的Unicode安装。
以下示例解包使用$ZWPACK打包的字符串(“ABCD”)。它将两个16位宽的字符分解为四个8位字符。请注意,在打包字符串的宽字符中,字节的字节序为低位顺序:十六进制4241 4443。
/// d ##class(PHA.TEST.Function).ZWUNPACK()
ClassMethod ZWUNPACK()
{
IF $SYSTEM.Version.IsUnicode() {
SET str=$CHAR(65,66,67,68)
WRITE !,$LENGTH(str)," characters: ",str
WRITE !,"$ZWPACK"
SET wstr=$ZWPACK(str)
WRITE !,$LENGTH(wstr)," packed characters: ",wstr
ZZDUMP wstr
WRITE !,"$ZWUNPACK"
SET nstr=$ZWUNPACK(wstr)
WRITE !,$LENGTH(nstr)," unpacked characters: ",nstr
} ELSE {
WRITE "This example requires a Unicode installation of Caché"
}
}
DHC-APP>d ##class(PHA.TEST.Function).ZWUNPACK()
4 characters: ABCD
$ZWPACK
2 packed characters: ????
0000: 4241 4443 ????
$ZWUNPACK
4 unpacked characters: ABCD
下面的示例执行与上一个示例相同的操作,但是使用大端顺序。请注意打包字符串的宽字符中字节的大端顺序:十六进制4142 4344。
/// d ##class(PHA.TEST.Function).ZWBUNPACK()
ClassMethod ZWBUNPACK()
{
IF $SYSTEM.Version.IsUnicode() {
SET str=$CHAR(65,66,67,68)
WRITE !,$LENGTH(str)," characters: ",str
WRITE !,"$ZWBPACK"
SET wstr=$ZWBPACK(str)
WRITE !,$LENGTH(wstr)," packed characters: ",wstr
ZZDUMP wstr
WRITE !,"$ZWBUNPACK"
SET nstr=$ZWBUNPACK(wstr)
WRITE !,$LENGTH(nstr)," unpacked characters: ",nstr
} ELSE {
WRITE "This example requires a Unicode installation of Caché"
}
}
DHC-APP>d ##class(PHA.TEST.Function).ZWBUNPACK()
4 characters: ABCD
$ZWBPACK
2 packed characters: ????
0000: 4142 4344 ????
$ZWBUNPACK
4 unpacked characters: ABCD
下面的示例显示了当“解压缩”一串8位字符时会发生什么。请注意,解压缩操作假定每个字符为16位宽的字符,因此将缺少的8位提供为十六进制00。不建议使用$ZWUNPACK。
/// d ##class(PHA.TEST.Function).ZWUNPACK1()
ClassMethod ZWUNPACK1()
{
IF $SYSTEM.Version.IsUnicode() {
SET str=$CHAR(65,66,67)
WRITE !,$LENGTH(str)," characters: ",str
SET nstr=$ZWUNPACK(str)
WRITE !,$LENGTH(nstr)," unpacked characters:"
ZZDUMP nstr
} ELSE {
WRITE "This example requires a Unicode installation of Caché"
}
}
DHC-APP>d ##class(PHA.TEST.Function).ZWUNPACK1()
3 characters: ABC
6 unpacked characters:
0000: 41 00 42 00 43 00 A.B.C.
下面的示例显示了当“解压缩”一个16位Unicode字符串时会发生什么。在这种情况下,请使用小写希腊字母。不建议使用$ZWUNPACK。
/// d ##class(PHA.TEST.Function).ZWUNPACK2()
ClassMethod ZWUNPACK2()
{
IF $SYSTEM.Version.IsUnicode() {
SET str=$CHAR(945,946,947)
WRITE !,$LENGTH(str)," characters: ",str
SET nstr=$ZWUNPACK(str)
WRITE !,$LENGTH(nstr)," unpacked characters: ",nstr
ZZDUMP nstr
} ELSE {
WRITE "This example requires a Unicode installation of Caché"
}
}
DHC-APP>d ##class(PHA.TEST.Function).ZWUNPACK2()
3 characters: αβγ
6 unpacked characters: ±????
0000: B1 03 B2 03 B3 03 ±.??.??.