string 学习2

来源:互联网 发布:解放战争诉苦大会 知乎 编辑:程序博客网 时间:2024/04/28 08:05

一、读写文件

1、读文件

str = string.load(filename);
str = string.load(filename,tag);

第一个字符串参数指定文件名,
第二个字符串参数指定读文件方式(类似io.open的最后一个参数),可省略(默认为"rb");
成功返回文件内容,失败返回nil。

可选的tag参数如下

可以通过以下字符标志控制读文件方式。
---------------------------
r+ 打开文件,如果不存在则创建
r 打开文字文件只读,等于rt
rb 以二进制方式打开文件只读
rt 以文本方式打开文件只读。

b表示以二进制方式读文件,t表示以文本方式读文件.
如果指定t模式,会自动将回车换行符号/r/n替换为单一的换行符号/n

例:
str = string.load("c://test.txt","rb");

也可以省略第二个参数,默认为rb。例:
str = string.load("c://test.txt");

您也可以自动捕获打开文件时遇到的错误:

--您是否想自动取得string.load为什么会出错呢?使用code,msg = win.lastError() 即可。
--您可能会想到,是否可以将 win.lastError()作为assert的第二个参数自动取得系统提供的错误信息?
--但是我们遇到一个参题, 我们必须取win.lastError()的第二个返回值,这时候就要用到select函数了

str = assert( string.load("c://no-file.txt") ,select( 2, win.lastError() ) );
--win.lastError()的所有返回值作为参数传递给select 等于 select(2,code,msg)
--select从第二个参数向后数,找到第一个参数指定的参数并返回

2、写文件

string.save(str,filename)
string.save(str,filename,tag);

第一个字符串参数指定文件名,
第二个字符串参数指定写文件方式(类似io.open的最后一个参数),可省略(默认为"w+b");
成功返回文件长度,失败返回nil。

可以通过以下字符标志控制读写件方式。
---------------------------
"w" 创建文字文件只写
"w+" 打开文件无论是否存在都创建新文件,原来的文件内容会被清除
"a" 打开(文件不存在则创建一个文件)并追加内容
"a+" 打开(文件不存在则创建一个文件)并追加内容
---------------------------
下面两个参数可以附加在上面任一个标记的后面,如果不指定,t为默认项
"b"表示以二进制方式写文件
"t"表示以文本方式写文件

如果指定t模式(或不指定b模式),会自动将单一的换行符号/n替换为回车换行符/r/n。

例:
string.save(str ,"c://test.txt","w+b")

也可以省略第二个参数,默认为w+b,例如:
string.save(str ,"c://test.txt")

使用string.load string.save io.open等函数设置读写标记时应遵守以下规则:

1、a,w,r等只能出现在第一个标记
用a+ w+ r+表示扩展的属性,如r+表示可读写,而不是rw

2、可使用ccs标记指定编码,

如 str = string.load(str,"c://test.txt","r,ccs=UTF-8")
将UTF8编码的test.txt读入并转换为标准UNICODE编码

如果输入错误的标记会弹出错误提示,而不是程序崩溃。
考虑到读写文件的效率,不会检测','号后面的指定编码部份是否正确(如果这部份写错了,将会导致程序崩溃)

 

二、内码转换

str2 = string.toUnicode(str,codepage);
第二个参数指定codepage,可省略第二个参数( 默认为ANSI:0 )
将字符串转换从指定编码转换为unicode编码。

string.fromUnicode(str,codepage);
第二个参数指定codepage,可省略第二个参数( 默认为ANSI:0 )
从unicode编码还原到指定编码。

在任何两种codepage(包括UTF8)之间转换编码都应当先转换为unicdoe编码
顺序为: codepage1-->unicode->codepage2


例如把UTF8转换为ANSI编码,应当这样写

_CP_UTF8 = 65001 --UTF-8 translation
_CP_ACP = 0 --default to ANSI code page
 
str = string.toUnicode(str,_CP_UTF8); --转换为unicode;
str = string.fromUnicode(str,_CP_ACP); --转换为ANSI编码


下面是一个简单的示例,将big5繁体编码转换为gb2312编码

win.consoleOpen();

str = "翠籓 羉砰"
str = string.toUnicode(str,950);
print("Unicode",str);
 
str = string.fromUnicode(str,936);
print("ANSI",str);

三、加密解密

str = string.encode(str[,key])
第一个参数指定待加密的字符串,第二个参数指定密钥。
可省略第二个参数,不指定密钥则进行base64编码,否则加密字符串。
如果指定第二个参数(密钥),则进行加密处理以后,再进行base64编码.

str = string.decode(str[,key[,check]])
第一个参数指定待解密的字符串,第二个参数指定密钥。第三个参数指定在解压前是否进行安全检测.
可省略第二个参数、第三个参数,不指定密钥则进行base64解码,否则解密字符串。

--string.decode的第一个参数如果不是一个已加密的字符串,会出现内存溢出错误。
--为避免出现这个错误,可以在将第三个参数check指定为true启用安全检测。
--不启用安全检测(省略第三个参数)可以加快解密的速度


str2 = string.decode("abcde" ,"k",true);
--通过增加一个true参数启用安全检测,如果字符串不是有效的加密字符串,则返回nil空值

--如果需要自动抛出错误,可以这样写

str2 = assert( string.decode("abcde" ,"k",true),"参数一不是被加密的字符串" );

base64编码可以方便的将二进制文件转换为字符串,以方便通过xml序列化存取。
使用base64编码,您可以把模拟程序要用到的图片、声音等文件写入ApeML的数据区块中。

下面是一个完整示例:

win.consoleOpen();
 
str = "这是一个字符串"
print(str);
 
str = string.encode( str,"这是一个密钥");
print("加密以后: "..str);
 
str = string.decode(str,"这是一个密钥");
print("解密以后: "..str);

三、压缩解压缩

在LAScript中,一个函数即可实现压缩解压缩二进制数据。

str = string.zip(str) 压缩字符串或二进制数据 ;
str = string.unzip(str) 解压缩字符串或二进制数据;

win.consoleOpen();
 
str = "这是一个字符串这是一个字符串这是一个字符串这是一个字符串这是一个字符串"
print("压缩以前字符串长度 "..#str);
 
str = string.zip( str);
print("压缩以后字符串长度 "..#str);
 
str = string.unzip(str)
print("解压后的字符串: "..str);

四、生成随机字符串

str = string.random(size[,strs]);
第一个参数指定字符串的长度,
第二个参数指定随机字符串集合(可以省略,默认为所有大小写字母及数字);

这个函数在官方提供的std脚本库中,
必须首先调用import("std")导入std脚本库,然后才能使用这个函数。

import("std"); --导入std脚本库

str = string.random(10);
   
--生成长度为十位包含大小写字母及数字的随机字符串

str = string.random(10,"这里可以指定字符集合");
   
--你可以通过第二个参数指定字符集合,可以使用中文、英文字母或数字, 但是不要中英文混杂在一起。

六、生成生成全球唯一标志

guid = string.getGUID();
生成全球唯一标志(即永不重复的字符串),返回值是一个字符串。

这个函数在官方提供的std脚本库中,
必须首先调用import("std")导入std脚本库,然后才能使用这个函数。

这个函数也是调用winapi的一个较复杂一点的例子,
可以打开/Fairy_Ape/import/std.LAS看这个函数的源代码。

import("std");

guid = string.getGUID();
win.messageBox(guid);
原创粉丝点击