aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 54049|回复: 59

aardio 10 发布: 全新的 Unicode 开发环境

  [复制链接]

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2016-3-3 08:34:22 | 显示全部楼层 |阅读模式
一、全新的 Unicode 开发环境
aardio 10 使用了全新的 Unicode 内核,开发环境基于 Unicode 支持非简体中文操作系统,aardio 创建的 Windows 窗口界面使用 Unicode(UTF16)编码,aardio 内核基于 UTF8 编码,aardio 字符串默认使用 UTF8 编码,aardio源代码使用 UTF8 编码 - 为与之前旧版的 AAU 内核以示区分,新版 aardio 源代码文件的后缀名改为 *.aardio

二、彻底重构、与友好的向下兼容。
aardio 10 虽然较之以前的 ANSI 版本有巨大的变化,不但完全更改了基础编码,并且重构了大部分的内核代码、标准库扩展库代码,大量的改进几乎涉及到每一个文件,但 aardio 10 仍然尽可能的兼容了旧版代码,打开旧版工程文件、旧版源代码会自动升级为新版格式,至于编码以调用 Unicode API为例,您仍然只需要向以前那样写代码:
::User32.MessageBox(0,'UTF8编码字符串','UTF8编码的标题',0)

使用上没有太大的变化,aardio 默默的为你做好了所有工作,字符串、对话框、界面等等都自动升级为了 Unicode 版本。

三、aardio代码编辑器改进
新的代码编辑器基于 Unicode,再也不用烦恼无法输入 Unicode 字符了,修正了很多旧版下让我们烦恼的小 BUG,新增支持同词高亮、括号匹配等提升代码效率的各种功能。

四、发布选项增加移除调试信息功能
在 aardio 10 中,可在发布选项中设置移除调试信息(错误信息中定位文件、行号等的信息),可减少EXE文件体积,增强发行文件安全性。

五、支持网站服务端开发
aardio 10 标准库已提供 fastcgi 实现,可以非常方便的编写一个fastcgi服务端模块,aardio 10 规范了统一的web服务端程序开发接口,例如在标准库中有一个完全兼容 fastcgi 接口的简单 Web 服务器实现,几句代码就可以在本地启动 Web 服务器和网站程序(请参考工程向导->网站,FastCGI 服务端)

六、语法改进,重点支持网站开发,全新的服务端模板语言。
aardio语法可直接支持与PHP类似的HTML模板语法,提供语言级别的模板解析,一个 aardio 源码文件,可以放 aardio 源码,也可以直接放 HTML,或者放 HTML, aardio 混合的模板代码,aardio 都能完美支持。

你可以在aardio10中创建一个源码文件,直接粘帖运行下面的代码,就可以迅速方便的生成一个网页(当然在IIS等服务器上同样方便)
<!doctype html>
<html><head><meta charset="utf-8"><title>帮助页面</title></head>
<body>当前时间<?
= time() ?>
</body></html>

与 PHP 不同的是,aardio 只支持短标签,并且规定开始标记后必须是空白或标点符号,这避免了与 XML 冲突,书写也更方便,另外 aardio 在解析时会自动清除不必要的空白,可避免在服务器上不小心提前输出 HTTP 头的问题。

七、其他语法改进
支持以反引号替代双引号包含字符串,通常含单引号的字符串我们用双引号,含双引号的字符串我们用单引号,那么同时包含单引号双引号的字符串呢?当然我们可以使用转义符、注释字符串,aardio10的反引号会更方便书写。

aardio变量名在包含中文时,不再限制中英文的前后顺序。

aardio10不再支持在源代码中使用全角标点替代操作符,当然这本来是不规范的写法,在其他语言中也不会让这么干的,有个别常用的符号,例如() {} , 等其全角符号与半角符号极其相似很容易混淆,不过不用担心,在 aardio 10 中,如果在字符串外部输入一个全角标点,aardio 10 会高亮显示错误输入,不用担心瞪大眼睛找全角符号的问题(不支持使用全角空格 )

八、新的Unicode字符串(UTF16)

在 aardio 10中,Unicode 字符串的下标操作符可以直接按字符单位使用了,示例:
import console;
var s = 'abc中文'u;
for(i=1;#s/2;1){
    console.log(
"Unicode字节码",i,s[ i ])
    console.log(
"Unicode字符",i,s[[ i ]])
}
console.pause(
true);

aardio10会隐藏字符串尾部的'\u0000'不会在字符串内容中出现。

九、新的字符串UTF标记规则。

这是在aardio 9中新增的机制,但aardio9设计的有问题,在aardio10中重新设计并保留了此功能,在aardio10中每个字符会有一个UTF标记,记录自己是UTF8,UTF16,还是ANSI编码的字符串,一个字符串在不能确定自己的编码时UTF标记可能为空,aardio会将无标记的字符串默认视为UTF8编码。

UTF8标记应当由aardio内核自动维护,用户不应当去获取或修改,但aardio仍然提供了两个函数string.getUtf,string.setUtf获取修改UTF标记 - 但尽可能不要去使用。aardio会自动去维护UTF标记,例如在源码中读取的字符串,一次成功的编码转换,或者string.len()函数一次成功的计算字符数,aardio在所有可能的机会都会设置UTF标记。

UTF标记的意义是支持编码的自动转换,并且可以避免重复转换,例如Unicode API就用到了UTF标记来同时支持UTF8、UTF16的字符串参数:
::User32.MessageBox(0,'UTF8编码字符串','UTF8编码的标题',0)
::User32.MessageBox(0,
'UTF16编码字符串'u,'UTF16编码的标题'u,0)

十、新的缓冲区类型(type.buffer)

使用 raw.buffer() 函数分配的内存缓冲区对象在aardio10中得到了增强,并为其创建的缓冲区新增了基础类型type.buffer,可以在常用的字符串函数中代替字符串使用,在API函数中可以代替字符串,引用字符串、指针、字节数组等使用.....移除了很多的使用限制。一个典型的应用是将缓冲区作为string.concat(的首参数,用于在内存中快速拼接字符串。缓冲区在aardio中可以象字符串一样作为一个字节数组使用,可以用#操作符取长度,用[]下标操作符取字节值,字符串是常量字节值是只读的,但缓冲区的字节值不但可读,也可以写入。

十一、增加API字符串指针检测
在结构体中,API对字符串字段返回一个小于0xFFFF或者为-1的无效字符串指针时,aardio会将其自动转换为指针类型,WINAPI中经常出现这种用法对一个字符串指针赋值0xFFFF以下的数值作其他用途,这会导致旧版aardio内存读写错误,在aardio10中自动处理了此问题。

十二、格式化时间支持指定使用的语言代码

例如:tm = time(,"%a %B %Y %m %d  %H:%M:%S","enu") 可指定格式化使用的语言,也可以在 locale 属性中指定。支持在tostring中指定格式化参数用于格式化时间,例如 tostring(tm,"%a %B %Y %m %d  %H:%M:%S","enu")  可使用的语言代码与setlocale()相同。

time().local() 改进:该函数保证返回的是本地时间,如果不是UTC时间则返回本地时间,否则转换。增加 time().utc() 函数返回UTC时间,如果已经是UTC时间则返回UTC时间,否则转换。

十三:模式匹配字符类内可以使用中文,例如 "[a-z:中文]+",


十四:新增二进制序列化对象的功能

table.tostring() 函数可以指定二进制序列化选项,生成的二进制格式aardio语法直接支持,可以直接使用aardio作为源码加载解析。二进制序列化有更好的性能。另外在aardio10中可以指定对象的 __serialize 元方法以自定义序列化操作,

十五、新增智能提示配置语法

在智能提示中,可用?号模糊匹配成员变量,支持下标操作符。该语法可用于配置成员名字不确定的对象的智能提示数据

十六、其他库函数改进

1、string.save 支持自动创建父目录可以直接保存生成文件,不用提前检查创建目录了。
2、新增 io.createDir io.joinpath 等函数。
3、增加string.unescape() 函数,可解码string.escape()函数生成的转义字符串,也可以解码JS,JSON等兼容的转义符。string.escape增加选项支持生成JS,JSON兼容的转义字符串,详见函数说明(web.json使用该函数生成转义字符串)
4、增加 string.hex() 函数,可以将字符串转换为十六进制编码,并可自定义转换格式(见参数说明),例如 string.hex(str,"%") 可直接生成URLEncode编码。这个函数比使用inet.url.encode方便之处在于可以自定义编码哪些字符,例如现在需要URLEncode一个路径,但不能编码斜杠、反斜杠,那么可以这样写 ..string.hex(path,"%","!.-_~*()\/")  
5、改进 io.exist 的判断规则,请参考该函数说明。
6、string.random 函数支持指定任意字符作为种子参数。
7、string.fromUnciode,string.toUtf16,string.fromto等可选指定需要转换的文本长度。
8、增加 inet.url.splitParameters
9、增加string.lastIndexOf函数,string.indexOf函数支持指定搜索范围
10、string.reverse(s,true) 增加按字符倒序
11、string.bytes(chars,off) 增加函数可按字符数返回字节数
12、raw.remoteApi取消字符串参数必须为输出参数的限制。库函数改进较多,在这里不一一列举,请参考各函数的函数说明。

十七、扩展库改进

所有扩展库同步升级支持 aardio10,
fsys.unrar 升级到最新 5.3 版本,支持 RAR5。
sevenZip.lzma, sevenZip.decoder2 升级到最新 7ZIP 15.14,已支持 Unicode 路径 。
java 扩展库改进,直接使用 UTF-8 编码不再转换,多个调用参数自动转换为数组 ......
......


评分

参与人数 4 +55 收起 理由
thinkai + 5 很给力!
淡然 + 5 很给力!
nvt303 + 40
love008 + 5

查看全部评分

166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2016-3-3 08:36:21 | 显示全部楼层

aardio 模板语法规则

在 aardio 代码中直接支持 HTML 模板语法。

一、aardio 代码如果以 HTML 代码开始,或以 <? 标记开始则自动启用模板语法。
aardio 代码可以是纯 aardio 代码,也可以是纯 HTML,或者是 HTML、aardio 相互混合的模板代码。
可直接将 HTML 模板代码复制到 aardio 编辑器中运行并预览网页。

可在 aardio 开发环境新建一个 aardio 源码文件,复制下面的源代码并粘贴到 aardio 编辑器中:
<!doctype html>
<html><head><meta charset="utf-8"><title>帮助页面</title></head>
<body>当前时间<?
= time() ?>
</body></html>

然后点【运行】按钮,可以看到立即生成了一个网页。

二、启用模板语法以后,aardio 代码必须置于 <? ..... ?> 内部。
aardio 将不在 <? ..... ?> 之内的部分作为参数调用全局函数 print 函数输出。
aardio 模板语法并不限于输出 HTML 代码 - 而是可用于输出任何文本。

三、使用 print 函数的规则:
   1)、aardio 中全局 print 函数只能用于捕获或修改模板输出,不可用于其他用途。
   2)、print 允许接收多个参数,并且必须对每个参数调用 tostring() 转换为字符串。
   3)、在一个独立 aardio 模板文件解析结束时,print 函数将收到一个 null 参数调用。

aardio 提供 string.loadcode() 函数可直接解析 aardio 模板并获取模板输出。
请在标准库 preload/string 中查看此函数的源代码,了解如何通过自定义 print 函数捕获或修改模板输出。

四、模板开始标记 <? 必须独立,不能紧跟英文字母。例如 <?xml..... 不被解析为 aardio 代码段开始标记。
另外,aardio 总是忽略文件开始的空白字符(包含空格、制表符,换行)。

五、可以使用 <?=表达式?> 输出文本 - 作用类似于 print( 表达式 ),可用逗号分隔多个表达式。
aardio 会忽略表达式前面等号首尾的空白字符 , 下面的写法也是允许的:
<?

= 表达式1,表达式2

?>

166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2016-3-3 08:39:01 | 显示全部楼层
这里指的Unicode API指的是使用UTF16编码字符串的API函数,例如WINAPI的Unicode版本函数都是使用UTF16编码,而aardio10是使用UTF8编码,aardio提供UTF8<-->UTF16双向自动转换的机制,而不需要自已编写编码转换的代码。

一、自动识别 Unicode API
aardio支持自动识别Unicode API并自动转换文本编码,一个最简单的例子:
::User32.MessageBox(0,"消息","标题",0)

aardio自动做好了所有的事,我们在调用API时一切都被简化,下面讲一下规则:
aardio在识别了一个Unicode AP函数时,在不声明API参数原型直接调用API时所有字符串参数在api-utf16 <--> aardio-utf8之间的双向自动转换(即视为ustring类型)。在声明参数的Unicode API中str,ustring类型被认为API需要一个UTF16编码的字符串aardio将会自动做双向转换,但string类型字认为是一个二进制字符串不作转换。

在非Unicode API函数中,ustring仍然被认为是显式声明的UTF16编码的字符串参数 - 然后会自动转换编码,string类型仍然被认为是二进制字符串,而str类型则被认为是一个多字节编码的字符串(ANSI或UTF8编码,以'\0'为终止符的C字符串)。

1)、在API调用约定中添加",unicode"声明该DLL的所有API为Unicode API,例如:
raw.loadDll("dll",,"stdcall,unicode") 声明该DLL中所有API为Unicode API。

2)、aardio认为API函数尾部以小写字母 + 大写"W"结尾是一个Unicode API。如果一个Unicode API 的函数名不是以"W"结尾,你仍然可以在函数名后面添加一个"W"(aardio会负责移除"W"找到真实的API函数,并确认它是一个Unicode API )对于同时提供ANSI,UNICODE两个版本的WINAPI函数,不添加“A”,“W”后缀明确指定版本时,由aardio自动切换到Unicode版本API。大多数WINAPI支持自动切换,例如 ::User32.MessageBox,少数WINAPI不但提供带A,W后缀的版本,还会提供不带A,W后缀的版本,这时候需要你自己指定具体的版本。


二、API参数类型 ustring

API新增ustring类型,该值指明API函数需要的是一个UTF16编码的Unicode字符串参数,你可以在调用API的参数中传入字符串,指针值,或缓冲区(raw.buffer创建),null值等等,当使用大写的USTRING时不允许null值。
如果你在调用API时,传给ustring/USTRING类型参数一个UTF8编码的字符串(aardio字符串默认为UTF8编码),aardio将负责自动转换为UTF16编码,而取输出参数时,aardio会自动将API返回的UTF16字符串转换为UTF8编码。


三、API结构体类型 word[] WORD []

word [] , WORD[] 等结构体数组类型,如果对应字段没有赋值为一个表数组,则作为ustring处理,同样可以自动实现UTF8<-->UTF16的双向转换。
{ WORD s[] = "abc"; } 这个结构体占用6个字符,"abc"被转换为UTF16记码的字符串,每字符占用两个字节。

四、编码转换优化规则
aardio在上面提到的所有API自动编码转换过程中,都会避免不必要的重复转换或错误转换, 例如: { WORD s[] = 'abc'u; } 这样直接指定一个UTF16编码的Unicode字符串时,aardio不会再做不必要的转换。对于结构体,aardio在一次转换成功以后,会更新到结构体字段中,并将其标识为一个UTF16字符串,下次如果检测到正确的标记就会直接取值而不是转换。





166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2016-3-3 08:40:52 | 显示全部楼层
一、注意全角标点导致的语法错误

aardio10代码中禁用所有全角标点(全角空格除外、字符串内部也无此限制)。如果在代码中输入了全角符号,那么在aardio10中会报语法错误,尤其是(),{}这几个符号与半角符号非常接近,要注意不要写错 -- 在aardio10的编辑器中对这些笔误会进行识别并以红色背景高亮显示。

二、注意直接在源代码中嵌入的HTML,XML要在charset中声明使用UTF-8编码
aardio10的源码代为UTF8编码,在源码中写的字符串字面值同样也是UTF8编码,如果将HTML,XML等代码直接写在aardio源码中,应当指明charset为UTF-8

三、注意 io.exist 规则变动

这个函数在旧版的判断规则很不合理,所以在旧版中该函数应用应当并不多,要注意旧版本 io.exist() 认为所有目录是可读写的,aardio10中只要参数是目录返回不可读写,只有参数是一个文件路径 ,并确有读写权限时才返回完整路径,这个函数在新版中可用于测试一个路径是否可以使用 io.file打开一个文件流进行读写。

四、注意Unicode API有指定长度参数时出现的问题。
在aardio10中支持UTF8编码自动转换为UTF16编码,WINAPI或C++实现的一些Unicode API通常使用UTF16编码,但一个字符串的UTF8编码长度与UTF16编码长度是不一致的,需要取长度的API应当使用 string.toUtf16()提前转换为Unicode。

如果指定缓冲区长度时,要注意对于UTF16字符串,内存所占用的字节长度为字符长度 × 2, 有些Unicode API的输出字符串参数要附加一个缓冲区长度参数,有的API是指定要以字节为单位,而有的API指定以字符为单位,要注意不要混淆,如果实在不能确定,最好是在原长度上乘以2.

例如 API
GetLongPathName = ::Kernel32.api("GetLongPathNameW","int(ustring  short,ustring&long,int cchBuffer)")

在调用时需要这样写
var len,path = GetLongPathName( ..io.fullpath(path) ,0x208,0x104);
cchBuffer指定是字符长度为0x104,而参数2指定的0x208为缓冲区的字节长度。

五、Unicode API不能自动切换时要手动指定版本。

对于与文本编码有关的WINAPI函数,一般存在分别加A,W后缀的版本,例如SendMessage这个API实际上真正的名字是SendMessageA或者::SendMessageW,对于这些API,如果你使用 SendMessage 这个名字导入API失败, aardio10会自动切换到W版本(Unicode版本),但有个别的API函数存在不带A,W后缀的版本,例如IsDialogMessage,对于这些API,应当使用IsDialogMessageW明确的指定调用Unicode版本。

如果其他非系统DLL提供的 Unicode API,函数名并不存在"W"后缀这种命名规则,你仍然可以在函数名后面加一个"W",aardio会移除这个"W"导入API,并且设置为Unciode API以支持编码自动转换。

可以在导入dll时在调用约定参数中指定该DLL所有与文本有关的API为 Unicode API,例如: var dll = raw.loadDll("test,dll",,"stdcall,unicode")

六:注意旧版日志文件的编码与新版不同

debug.log fsys.log 等日志文件,写入编码为UTF-8格式,如果旧版程序升级,应更改日志文件路径以创建UTF8文件。

七、注意配置文件编码变动。

使用 fsys.config,fsys.talbe创建的配置文件,旧版为ANSI编码,新版为UTF8编码,aardio10为兼容旧版配置文件,会在新的配置文件前加UTF8的BOM头,没有BOM头的会自动将ANSI编码转换为UTF8编码。

八、注意部分过时不实用的函数或库被移除

这些被删除的函数分为两类:
一是与GBK编码有关的,例如新版中移除了string.mbcs,mbs,string.gbk等支持库,如有需要操作GBK等编码的字符串,建议先转换为UTF8编码再处理。
另外是一些使用频率不高、在新版中有更好替代的函数,例如web.json.decodeString函数已经移除,因为aardio10已支持JSON兼容的Unicode编码、解码,web.json.decodeString可以使用 string.unescape(),eval() , web.json.parse() 等函数替代。

九、因为所有文件都变更了,请不要在aardio10以下的旧版开发环境上 - 直接覆盖aardio10升级。

十、在aardio10中打开旧版工程文件时,可自动升级为UTF8编码,但反过来旧版并不支持UTF8编码,因工程文件有自动保存的功能,请不要在旧版中打开aardio10工程文件。

如果大家在升级中遇到任何疑问,可扫下面的二维码加官方微信直接发给我:


166

主题

2154

回帖

1万

积分

管理员

积分
13056
 楼主| 发表于 2016-3-3 08:43:47 | 显示全部楼层
以小为美的aardio,在增加这一大堆的功能以后,体积继续减小到6MB.
我们不和其他开发工具比强大,我们比简单、小、轻、快。最后祝大家使用愉快,升级中遇到任何问题,请在aardio 开始页关注微信公众号直接发给我。

特别感谢反馈新版问题协助改进的用户:
卢春江,天~&#9836;,inew,Auron,乐其,茶红冰,neesam,Else,彭奕,朴实,kio1 ....... 等

0

主题

3

回帖

106

积分

荣誉会员

积分
106
发表于 2016-3-3 08:58:01 | 显示全部楼层
哇,2016,最大惊喜啊。
aardio 太强大了。
辛苦版主了。

6

主题

123

回帖

1113

积分

四级会员

积分
1113
发表于 2016-3-3 09:12:25 | 显示全部楼层
版主辛苦了.

1

主题

8

回帖

121

积分

一级会员

积分
121
发表于 2016-3-3 09:13:10 | 显示全部楼层
我滴那个神咧,版主你也太厉害啦!

1

主题

37

回帖

282

积分

二级会员

积分
282
发表于 2016-3-3 09:14:54 | 显示全部楼层
幸福来的太突然了,版主辛苦了

3

主题

14

回帖

170

积分

一级会员

积分
170
发表于 2016-3-3 09:17:36 | 显示全部楼层
Jacen.He 发表于 2016-3-3 08:36
在aardio代码中直接支持HTML模板语法。
一、一个aardio文件,即可以是纯aardio代码,也可以是纯HTML,也可 ...

楼主 费心了!!!我们还需要多加学习!!!!!!!!谢谢

4

主题

8

回帖

97

积分

一级会员

积分
97
QQ
发表于 2016-3-3 09:19:10 | 显示全部楼层
辛苦了,感觉是越来越强大,之前在做处理utf8字符的时候要使用转换,现在好了,适用不必来回转换了,而且适用多语言的系统,赞一个

6

主题

29

回帖

256

积分

二级会员

积分
256
发表于 2016-3-3 09:23:55 | 显示全部楼层
感谢楼主一直默默的更新

0

主题

54

回帖

362

积分

二级会员

积分
362
QQ
发表于 2016-3-3 09:28:05 | 显示全部楼层
Jacen和嫂子辛苦了!

1

主题

9

回帖

58

积分

一级会员

积分
58
发表于 2016-3-3 09:32:01 | 显示全部楼层
太棒了,楼主辛苦了

3

主题

18

回帖

184

积分

培训班

积分
184
发表于 2016-3-3 09:34:02 | 显示全部楼层
确实辛苦了, 这么大的改动! 这么细心的写描述, 谢谢版主!

1

主题

9

回帖

58

积分

一级会员

积分
58
发表于 2016-3-3 09:34:32 | 显示全部楼层
下载不了,报服务器错误

0

主题

1

回帖

8

积分

新手入门

积分
8
发表于 2016-3-3 09:36:10 | 显示全部楼层
点个赞

4

主题

14

回帖

408

积分

二级会员

积分
408
发表于 2016-3-3 09:43:40 | 显示全部楼层
我是Jacen的脑残粉

50

主题

226

回帖

1679

积分

荣誉会员

积分
1679
发表于 2016-3-3 09:45:36 | 显示全部楼层
强大无比,可喜可贺!!
先研究下aardio网站开发
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-2-14 09:43 , Processed in 0.092783 second(s), 32 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表