北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 13766|回复: 9

[mush+perl]怎么处理中文参数?

[复制链接]
发表于 2015-1-27 13:43:16 | 显示全部楼层 |阅读模式
本帖最后由 purbam 于 2015-1-28 11:54 AM 编辑

原帖编辑了一下,最根本的原因应该是perl里面中文参数传递的问题

一个很简单的测试trigger
      enabled="y"
   match="^[> ]*你(点了点)头"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  $world->SetVariable(testvar, "%1");
  


会报syntax error如果捕获的是非汉字就没有问题,甚至也不是所有汉字都有问题,比如把上面的pattern改成”^[> ]*你点(了点)头“就正常了


同样的trigger在lua里没有问题,觉得还是perl和mushclient之间传递处理中文的问题
试了用perl的Encode模块,对字符串先decode,但试了utf8,gb2312都不行,而且结果有随机性


求高手指点
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-1-27 15:24:33 | 显示全部楼层
用lua就没问题,难道是perl处理utf的问题?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-1-27 16:29:28 | 显示全部楼层
Unrecognized character \xF6
应该是编码问题,可能是你的mcl文件编码不对。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-1-27 16:49:54 | 显示全部楼层
Unrecognized character \xF6
应该是编码问题,可能是你的mcl文件编码不对。
nsonline 发表于 2015-1-27 04:29 PM


mcl文件我用notepad和vim打开来看过,没发现什么特殊字符
现在基本能肯定不是脚本本身的问题,而是trigger里抓取到的中文,再通过$world->SetVariable("xxx", "%1")传递到perl解释器的时候出现了问题
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-1-28 02:13:46 | 显示全部楼层
回复 4# purbam


    下载个notepad++软件,免费,支持多种语言代码和字符编码。用这个软件打开你的script文件,然后在encoding那里转换一下文件文字编码试试。我用python,就发现只有我把script编码设置成ascii,mush才能认,其他编码都会出错,比如utf-8之类的。

windows的notepad没有看文件编码那一项,所以你不知道文件是什么编码的。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-1-28 10:47:40 | 显示全部楼层
回复  purbam


    下载个notepad++软件,免费,支持多种语言代码和字符编码。用这个软件打开你的scri ...
windyhawk 发表于 2015-1-28 02:13 AM


vim可以查看和更改格式,notepad虽然不能直接看,但是另存的时候也可以选择存为ansi或者utf8(其实也算是能看,因为另存的时候默认编码格式就是当前的编码格式)
应该不是脚本本身编码问题,是在正则里捕获的中文,被当成参数传给脚本函数的时候编码出了问题。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-2-4 18:05:22 | 显示全部楼层
本帖最后由 creat 于 2015-2-4 10:06 AM 编辑

把[> ]去掉呢?有时这种半角符号也会造成错误吧??设置 output里可以把>直接解析为\n
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-2-4 18:46:56 | 显示全部楼层
把[> ]去掉呢?有时这种半角符号也会造成错误吧??设置 output里可以把>直接解析为\n
creat 发表于 2015-2-4 06:05 PM


应该跟这个无关,我所有的trigger都是这么写的,但是有问题的只有几个
pattern如果出问题,正则应该匹配不上才对,也就进不到被调用的函数里了

这两天偶然发现个不是办法的办法,就是在涉及到中文参数传递的语句前后多加几个换行
比如$world->SetVariable(testvar, "%1")会出错,但是


$world->....


就好了
如果一行里有多个中文变量,那就要再多加几个换行才会好,也不知道为什么,而且不太稳定,有时候正常,过几天又不正常了
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-2-4 19:48:40 | 显示全部楼层
我遇到过一种情况,虽然和你碰到的可能不太一样│□大擒拿手 (qinna-shou)                    - 勉勉强强  138/     28│
这种格式用
^[│\s+|│□](\W+)\s\((\D+)\)\s+\-\s*\W+\s*(\d*)\/\s*(\d*)$
匹配会出现乱码,触发的时候print "%0"完全正常,传递到脚本中则出现(  "Α醮笄苣檬?="qinna-shou")
之后换用
^(?:│\s+|│□)(\W+)\s\((\D+)\)\s+\-\s*\W+\s*(\d*)\/\s*(\d*)│$
才恢复正常
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-2-6 09:43:00 | 显示全部楼层
我遇到过一种情况,虽然和你碰到的可能不太一样│□大擒拿手 (qinna-shou)                    - 勉勉强强  ...
creat 发表于 2015-2-4 07:48 PM



试了一下你的方法,还是不行,看来不是同一个问题
我所有的中文参数传递都会随机的出问题,不仅仅是开头有全角中文字符的时候,比如我顶楼提到的一个简单emote

真是要崩溃了,不行只能放弃perl了,唉
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 05:00 AM , Processed in 0.011971 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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