Project1

标题: Window_Message 的神秘代号 [打印本页]

作者: 灯笼菜刀王    时间: 2018-11-13 11:47
标题: Window_Message 的神秘代号
本帖最后由 灯笼菜刀王 于 2018-11-13 12:08 编辑

呃, 感觉标题加上震惊, 我就可以直接去UC部报道了, 没辙, 实在不知道该用什么标题, 各位看官将就将就.....

问题来自默认的 Window_Message 脚本



这个是显示文章里的控制符处理, 今天在改造它的时候发现了一个问题,  百思不得其解

text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\008[#{$1}]" }

这个转码操作, 后面的数字 000-007 都可以正常使用, 但是一旦超过007, 用008, 它就失效了(当然下面的 c == "\002",也有一起改成008)



默认的\C 命令, 002换成008就变成这样了~

经过 p 查看运行情况, 发现 代码改成008后, 下面的 c =="\008" 这个判定就不成立了

请问下, 这个是什么原因呢?

-------------------------------------------
思考了下, 从运行后的图显示 \8 来看, c == "\008" 判定不成立是不是因为 代码改008后, gsub! 替换掉的不是008而是8?
如果是这个原因, 那为什么008之前的就不会丢掉00呢
作者: 百里_飞柳    时间: 2018-11-13 15:03
本帖最后由 百里_飞柳 于 2018-11-13 15:05 编辑

其实有没有想过 \007 还有效,可能就是因为这种 \+三个数字的 表示法是 八进制 数字的表示?

我用新版本的Ruby试了下
  1. p c = "\005[12]"   # => "\u0005[12]"
  2. p c.slice(/./m)    # => "\u0005"

  3. p c = "\008[12]"   # => "\u00008[12]"
  4. p c.slice(/./m)    # => "\u0000"
复制代码


然后继续试了下替换掉前面的00
  1. p c = "\105[12]"  # => "E[12]" # 01000101
  2. p c = "\121[12]"  # => "Q[12]" # 01010001
复制代码

恰好是八进制下这两个字母的ascii码

所以它本质上就是八进制的一个数字,当被slice时会作为整体一同处理,但如果你冒出个\008,那么8就作为了下一个字符,而00被扩展识别成了\u0000的八进制数字




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1