在脚本开发过程中,特别是相较于底层语言C/CAPL来说,一般字符串都是以ASCII码来识别,这样我们会遇到的问题就是大小写未统一的情况下无法进行字符串识别,导致测试脚本出现bug后很难查找到bug问题所在,因此我们需要对于字符串进行修改为大写或者小写的修改,这样对于字符串的输出可以进行模糊的匹配,极大的方便使用;另外就是字符串的编码问题,虽然CAPL支持的编码格式不多,但是并不能保证我们工作中不会遇到,因此对于编码的处理vector也提供了部分编码转换的函数供我们使用,依然也在今天的文章中;最后就是字符串的长度,这对于我们处理字符串中的复制、拼接等有不可替代的作用,大家也可以关注下。
功能:将字符串从一种编码格式转换为另外一种编码格式
说明:将字符串从一种编码转换为另一种编码。转换字符串的长度取决于请求的编码。输出字节数组中使用的字节数被写入encodeSize。如果输出数组maxOutputSize的大小不足以容纳转换后的字符串和终止的“\0”,则函数返回错误,输出内容未定义。无法在请求的编码中表示的字符将替换为Windows函数WideCharToMultiByte选择的最佳匹配字符。
output:目标字节数组
encodedSize:ConvertString将输出中使用的字节数(包括终止的“\0”)写入此参数。
maxOutputSize:输出最大数组的大小
outputCodepage:输出编码格式,包括:
CP_UTF8
CP_UTF16
CP_LATIN1
CP_SHIFT_JIS
input:编码代码页中的输入字符串,没有BOM。
inputSize:输入字符串数组的大小
inputCodepage:输入编码格式,包括:
CP_UTF8
CP_UTF16
CP_LATIN1
CP_SHIFT_JIS
返回值:
0:编码转换成功,字节数组输出和结果长度encodedSize有效。
-1:非法字符(例如非法UTF8码点)。
-2:缓冲区空间不足,输出数组太小。
-3:内部错误。
//将系统变量字符串值(例如从面板输入)转换为UTF-16,反之亦然
includes
{
#include "Encoding.cin"
}
// 处理字符串的输入,例如从面板输入
on sysvar TestVars::StringSV
{
byte data[100]; long nrOfBytes; byte data2[200]; long res;
// 获取UTF-8格式的字符串
sysGetVariableData(sysvar::TestVars::StringSV, data, nrOfBytes);
// 将其转换为UTF-16
res = ConvertString(data2, nrOfBytes, elcount(data2), CP_UTF16, data, nrOfBytes, CP_UTF8);
//现在使用UTF-16字节,例如通过网络发送
//这里使用data类型的系统变量进行模拟
sysSetVariableData(sysvar::TestVars::DataVar, data2, nrOfBytes);
}
//例如从网络接收UTF-16数据
//这里使用data类型的系统变量进行模拟
on sysvar TestVars::DataVar
{
byte data[200]; long nrOfBytes; byte data2[100]; long res;
sysGetVariableData(sysvar::TestVars::DataVar, data, nrOfBytes);
// data是UTF-16中的字符串;将其转换为UTF-8
res = ConvertString(data2, nrOfBytes, elcount(bytes), CP_UTF8, data, nrOfBytes, CP_UTF16);
//将字符串复制到string类型的系统变量中,例如在面板中显示
sysSetVariableData(sysvar::TestVars::OutStringVar, data2, nrOfBytes);
}
功能:解码从编码代码页输入的字节数组。
说明:将从编码代码页输入的字节数组解码为当前CAPL字符串编码。
解码字符串的长度取决于给定的编码。如果输出数组outputSize的大小不足以容纳解码的字符串和终止的“\0”,则函数将返回错误,并且输出的内容未定义。当前编码中无法表示的字符将替换为Windows函数WideCharToMultiByte选择的最佳匹配字符。
output:目标字节数组
outputSize:输出数组大小
input:编码代码页中的输入字符串,没有BOM。
Codepage:编码格式,包括:
CP_UTF8
CP_UTF16
CP_LATIN1
CP_SHIFT_JIS
返回值:
0:成功,字节数组输出有效。
-1:非法字符(例如非法UTF8码点)。
-2: 缓冲区空间不足,输出数组太小。
-3:内部错误。
includes
{
#include "Encoding.cin"
}
{
int result;
char text[10];
byte stream[6] = {0xC3, 0xA4, 0xC3, 0xB6, 0xC3, 0xBC};
result = DecodeString(text, 10, stream, 6, CP_UTF8);
// 在德语面板上,文本现在是{‘ä’, ‘ö’, ‘ü’, 0}
if (result == 0) {
write(text);
// 输出(在德语窗口上):äöü
}
}
功能:使用编码代码页对字符串输入进行编码。
说明:使用编码代码页对字符串输入进行编码;
编码字符串的长度和终止“\0”取决于请求的编码。输出字节数组中使用的字节数被写入encodeSize。如果输出数组maxOutputSize的大小不足以容纳编码字符串和“\0”,则函数返回错误,输出数组的内容未定义。
无法在请求的编码中表示的字符将替换为Windows函数WideCharToMultiByte选择的最佳匹配字符。
注意:CAPL字符串编码通常与源文件的编码匹配。使用CAPL浏览器创建文件时,它将以与计算机语言设置匹配的编码保存文件,并在文件开头的特殊注释中写入编码。如果源文件以UTF-16编码,或者如果包含文件的编码与源文件不同,则CAPL字符串编码将为UTF-8。
output:目标字节数组
encodedSize:输出数组大小
maxOutputSize:数组输出的最大值
input:编码代码页中的输入字符串,没有BOM。
codepage:编码格式,包括:
CP_UTF8
CP_UTF16
CP_LATIN1
CP_SHIFT_JIS
返回值:
0:成功,字节数组输出和结果长度encodedSize有效。
-1:非法字符(例如非法UTF8码点)。
-2: 缓冲区空间不足,输出数组太小。
-3:内部错误。
includes
{
#include "Encoding.cin"
}
{
int result;
char text[4] = "äöü";
byte stream[10];
long len;
result = EncodeString(stream, len, 10, text, CP_UTF8);
// 在德语面板上,len现在是7,stream现在是{0xC3,0xA4,0xC3,0xB6,0xC3、0xBC,0};
if (result == 0) {...}
}
功能:将字符或者字符串转换为小写;支持将字符或字符串中包含A - Z转换为a - z.
c:待转换的字符
source:待转换的字符串
dest:转换完成的字符串存放的数组
bufferSize:dest数组的大小
char buffer[20];
toLower(buffer, "Vector", elcount(buffer));
write("buffer is : %s", buffer);
//输出结果
// buffer is :"vector"
功能:将字符或者字符串转换为大写;支持将字符或字符串中包含a - z转换为A - Z
c:待转换的字符
source:待转换的字符串
dest:转换完成的字符串存放的数组
bufferSize:dest数组的大小
char buffer[20];
toUpper(buffer, "Vector", elcount(buffer));
write("buffer is : %s", buffer);
//输出结果
// buffer is :"VECTOR"
功能:返回字符串的长度(以字符为单位)。
s:待计算长度的字符串
返回值:字符串s的长度
long length;
char s1[10] = "door";
char s2[10] = "Tür";
write("%d %d", mbstrlen(s1), strlen(s1));
write("%d %d", mbstrlen(s2), strlen(s2));
//输出结果
// 4 4
// 3 [3 or 4取决于字符串的编码格式]
功能:获取字符串的长度(以字节为单位)。
说明:根据字符串编码,字符可能需要几个字节,例如Windows ANSI(932)编码中的日语字符或UTF-8编码中的任何特殊字符。在这种情况下,使用mbstrlen函数更合适。
s:待计算长度的字符串
返回值:字符串s的长度
long length;
char buffer[100] = "CANalyzer";
length = strlen(buffer);
write("length is %s", length);
//输出结果
length is 9