acdd 发表于 2015-8-8 11:02:39

有用tintin++的前辈吗?小弟发现有些字不能被触发。

本帖最后由 acdd 于 2015-8-8 11:08 AM 编辑

把{charset}设成{big5}的时候,匹配内容里只要有编码以5C(十进制是92)结尾的汉字就不能被触发,比如GBK编码的“乗”、“俓”、“蒤”,big5编码的“苒”等等。如果把{charset}改回{ascii},虽然可以正常触发,但是会显示成乱码,比如执行“#showme 测乗试”,显示的是“测伿”。
版本是最新的2.01.1,求大神指点迷津,小弟感激不尽yct43.

北大侠客行MUD,中国最好的MUD

erq 发表于 2015-8-8 16:51:57

linux 还是 cygwin 下?

acdd 发表于 2015-8-8 18:33:24

终于有人理我了 激动ing。。。
小弟用的linux,cygwin没试过,不过wintin++也有这些问题。试的时候用的这几个命令:
#config charset big5
#action {测乗试} {#showme 么么哒}
#showme 测乗试
本来应该显示“么么哒”,然而神马也木有发生。。。

erq 发表于 2015-8-8 19:11:59

我试了下确实是有问题的....我以为 lz 的问题是显示乱码呢...我也不知道了~

acdd 发表于 2015-8-8 19:25:03

谢谢帮忙测试!看来很可能是tintin++在处理中文上有bug了。。{:7_288:}

oolong 发表于 2015-8-10 00:11:14

我论坛下过一个wintin++,打开看很原始,就没兴趣了。
tintin++和zmud基本语法接近,还是很推荐zmud玩家使用的,不过wintin++客户端就算了。

我推荐下面的客户端。
Jaba Mud Client 3.6
http://nerevar.github.io/jmc/
缺点:英文界面,如果觉得不方便,用eXeScope自己汉化一下吧。
优点:支持基本全Tintin++ 的命令。vbs,js的脚本

Wintin 95
老的wintin软件基本和zmud 462差不多,不过计算能力强。

wintin.net
新的wintin 客户端,支持C,vbs,Lua。应该很强大,鄙人没研究过,主要书剑mud每次登陆在提示Y/N的时候报错,pkuxkx没事。。。

tortilla mud client
JMC的升级版本,强大,强大。可惜界面俄文。要手动汉化一下

oolong 发表于 2015-8-10 00:11:23

我论坛下过一个wintin++,打开看很原始,就没兴趣了。
tintin++和zmud基本语法接近,还是很推荐zmud玩家使用的,不过wintin++客户端就算了。

我推荐下面的客户端。
Jaba Mud Client 3.6
http://nerevar.github.io/jmc/
缺点:英文界面,如果觉得不方便,用eXeScope自己汉化一下吧。
优点:支持基本全Tintin++ 的命令。vbs,js的脚本

Wintin 95
老的wintin软件基本和zmud 462差不多,不过计算能力强。

wintin.net
新的wintin 客户端,支持C,vbs,Lua。应该很强大,鄙人没研究过,主要书剑mud每次登陆在提示Y/N的时候报错,pkuxkx没事。。。

tortilla mud client
JMC的升级版本,强大,强大。可惜界面俄文。要手动汉化一下

acdd 发表于 2015-8-11 13:00:36

本帖最后由 acdd 于 2015-8-11 01:04 PM 编辑

挨个试了楼上大侠推荐的客户端,发现它们对中文支持也不理想,而且扩展能力都没有tintin++强,小弟再三思索,还是决定接着用tintin++。。但是一想起来那个bug,就浑身不舒服斯基,于是乎,小弟从tintin++官网下载了源代码,因为小弟只懂一丢丢点儿的C语言,完全不懂神马telnet之类滴,所以只是抱着试一试滴心态,想把bug揪出来,结果瞎猫碰上死耗子,真就被偶找出来了。。。
下边两个小bug都是在把charset设置成big5的时候(#config charset big5)才会出现,把charset设置成ascii的时候好像会出现另外一些bug,不过小弟不用ascii,所以ascii下的bug对小弟来说不算bug。。。

==============================================================================
第一个就是一楼说的编码以5C(十进制是92)结尾的汉字不能被触发
十进制编码为92的字符是反斜杠“\”,在正则表达式里反斜杠是特殊字符,要对特殊字符本身做匹配必须对其转义。把charset设成ascii的时候,tintin++会测试每个字节是否为特殊字符,然后对特殊字符进行转义,而把charset设成big5时,tintin++遇到不在0~127范围里的字节(gbk、big5编码的第一个字节)时会直接跳过下一个字节,比如“乗”的两个字节是129 92,tintin++遇到129就会跳过92,本来应该转义的92却原封不动就交给正则表达式引擎编译,会导致编译出错,就算不出错编译结果也绝不会是偶们想要的。
*解决办法*是在tinexp.c中找到:
pcre *tintin_regexp_compile(struct session *ses, struct listnode *node, char *exp, int option)
在它下边大括号里再找到:
if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *pti & 128 && pti != 0)
往下看可以看到有两行“*pto++ = *pti++;”,把第二个,也就是“continue”上边的,改成:
switch (pti)
{
        case '[':
        case ']':
        case '(':
        case ')';
        case '|':
        case '.':
        case '?':
        case '+':
        case '*':
        case '^':
        case '\\':
                *pto++ = '\\';
        default:
                *pto++ = *pti++;
}
==============================================================================

==============================================================================
第二个是关于换行的。首先执行“#config charset big5”,然后在扬州中央广场“n;s”,如果紧接着地点描述的消息(一定要紧接着)是“XXX手持YYYY……”或者“XXX身穿YYYY……”,其中YYYY带颜色,这时候的正常显示应该是:
        这里明显的出口是 north、south、east、down、west 和 up。
        大榕树(Rong shu)
        >
        XXX手持YYYY……
然而实际显示的是
        这里明显的出口是 north、south、east、down、west 和 up。
        大榕树(Rong shu)
        >XXX手持
        YYYY……
这个好像是telnet之类滴东东,小弟也不知道具体是什么原因,只能接着求大神解释了,不过大神们好像都很忙。。。
*解决办法*还是有滴,在telopt.c中找到:
int translate_telopts(struct session *ses, unsigned char *src, int cplen)
下边大括号里再找
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
然后把

……
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
{
        *cpdst++ = *cpsrc++;
……

换成

……
else if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *cpsrc & 0x80)
{
        if (HAS_BIT(ses->telopts, TELOPT_FLAG_PROMPT))
        {
                DEL_BIT(ses->telopts, TELOPT_FLAG_PROMPT);

                if (HAS_BIT(ses->flags, SES_FLAG_SPLIT) || !IS_SPLIT(ses))
                {
                        *cpdst++ = '\n';
                        gtd->mud_output_len++;
                }
        }
        *cpdst++ = *cpsrc++;
……

==============================================================================

还有一个是关于#show的,这个其实不理它也无所谓,不过小弟。。额。。是个强迫症。。。
#show会把所有最后一个字符是反斜杠的行当做是提示行(是这么叫吧-_-!),举个栗子,输入“#show 可恶的反斜杠\”,光标就会停在“杠”字后面,输入“#show 反斜杠去见鬼”,光标就停在了下一行的行首。这木有问题,不过让偶们把“乗”大仙请出来,输入“#show 乗”,末尾并没有“\”,可光标却停在了“乗”字后面。。。偶们要做的就是判断前一个字节是否大于127,如果是就忽略掉后面的反斜杠。
*解决办法*是在utils.c中找到“int str_suffix(char *str1, char *str2)”,把它下边大括号里的:
if (!strcasecmp(str1 + len1 - len2, str2))
改成
if (!(strcasecmp(str1 + len1 - len2, str2) || str & 128))

建议楼上大侠试试在linux上用tintin++,linux上的tintin++有#run命令,配合#action命令,任何语言都可以用来写脚本啦。wintin++没有#run,只能用它自带的命令写脚本,虽然也够用,不过偶发现它的数组下标是从1开始的,顿时心中千万只羊驼奔腾而过,再也不想用了。。。。

trace 发表于 2015-8-11 14:49:29

赞一个。

seagull 发表于 2015-8-11 19:29:08

擦,大牛啊
页: [1] 2
查看完整版本: 有用tintin++的前辈吗?小弟发现有些字不能被触发。