设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1840|回复: 6
打印 上一主题 下一主题

[已经解决] 有关6R图书馆的问题

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
120
在线时间
73 小时
注册时间
2008-7-9
帖子
234
跳转到指定楼层
1
发表于 2009-9-4 06:38:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 well 于 2009-9-13 04:42 编辑

用来上网的电脑没法RM真是麻烦……话转正题目。
用了6R图书馆脚本后的两个问题。都是(大概)关于排版的。
一是第一行比大多数行少一个字的宽度。此处行指的是RM窗口里面显示文字的行。
二是特定行会吞掉一个字。此处行指的是txt里面的行。

在scene里面有这样一句,只记得大概(汗)
text = tempstory.slice!(0,84)
tempstory里一次存入文本里的一行。所以上面那句是用来为RM显示换行的。84,查帮助文件说是字节数。如果按2字节一个中文字来算的话,是说一行有42个字吗?不清楚,不过也没什么所谓。总之这个84代表了RM窗口里一行的内容。这个数字是一点点试出来的。因为改过了窗口和文字大小,不能套用原版。然后,就出现上述问题。
因为在这一句前有三句sub,替换txt中的半角标点为全角。但是txt中还有半角数字。推测应该是在这上面出了问题。
出问题的那行有4个半角数字。它下面的一行没有出问题,有3个半角数字。我把问题行的数字删去一个后,果然都显示了。照目前的情形看起来,被吞掉的那个字是因为被slice从中劈开了。那么按理说,在被吞掉的字前面加一个半角空格也能避免吞字现象才是。试验后失败。
至于第一行少一字宽度的问题。因为并没有吞字。比起第二个问题尚能忍受。

求释疑兼解决方案。
血瞳睨世

也来玩一下养小龙吧

Lv1.梦旅人

梦石
0
星屑
120
在线时间
73 小时
注册时间
2008-7-9
帖子
234
2
 楼主| 发表于 2009-9-5 07:02:25 | 只看该作者

隔天自顶一次
血瞳睨世

也来玩一下养小龙吧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
73 小时
注册时间
2008-7-9
帖子
234
3
 楼主| 发表于 2009-9-6 12:31:42 | 只看该作者
隔天再顶。难道其他用图书馆脚本的人都没碰过这麻烦问题吗?
血瞳睨世

也来玩一下养小龙吧
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

4
发表于 2009-9-6 12:37:00 | 只看该作者
>_<你确定是用了UTF-8编码吗= =
slice删掉了开头起82个字符
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
73 小时
注册时间
2008-7-9
帖子
234
5
 楼主| 发表于 2009-9-9 07:05:56 | 只看该作者
是UTF-8没错,否则就全部乱码了。
请问82这个数字是怎么得来的呢?
血瞳睨世

也来玩一下养小龙吧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2009-9-13 02:53:23 | 只看该作者
才发现这贴,来晚了……

  • 第一行空出一个字的问题是这样的:程序读取文本时需要事先知道它的编码方式,所以一般会在文件头写入一个表示了编码方式的记号,而我们的 UTF-8 字符集编码就是在文件开头写入这么个三字节的记号:0xEFBBBF。这个脚本在读取的时候把这个记号也读入了,并且和其它汉字一样占 3 个字节,所以最后看到的第一行空出了一个字实际上就是因为脚本还读取了这个记号,而记号在字符集中并不表示任何字符,因此整个字符串的描绘都向左移了~
    解决方法就是在 file = File.open(filename, "r") 这一行下面、IO 对象初始化之后加一句:
    file.seek(3),让输入流从第三个字节开始输入,跳过三字节的 UTF-8 编码记号
  • 要弄清楚第二个问题就要先搞懂 UTF-8 相关的一些知识:
    首先,在 UTF-8 编码规范中,汉字是被编码为三个字节的,ASCII 字符则仍然是一个字节~这个图书馆脚本本来用的是 75 这个数,一行刚好可以显示 25 个汉字,而你的 82 不是 3 的倍数,显然不对,除非你每一行都刚好有奇数数量个 ASCII 字符,这样就可以凑出 (3 的倍数的字节)+(奇数数量的字节) = 82

    由于你一开始就把汉字的字节数记错了,所以自然对第二个问题百思不得其解——
    三个半角字符加上其它汉字,最后还是 3 的倍数,所以不会出现在一个完整的三字节汉字之间断开的情况;
    四个半角字符加上其它汉字,最后是 3 的倍数 + 1,这样一来就读取了本来应该是下一行第一个汉字的两个字节,这两个字节当然是不完整的,所以下一行的第一个汉字就没有描绘出来;
    问题行删去一个半角字符,刚好是 3 的倍数,所以没有问题;
    在被吞掉的字前面加一个半角空格,就相当于一行里面有了 5 个半角字符,最后就成了 3 的倍数 + 2,这样就会读取到下一行第一个汉字的一个字节,所以也是不完整的~如果加上两个半角空格,自然就有效了(当然这个脚本会把两个半角空格转换成一个全角的 =v=)

    解决方法呢,简单点可以让这个脚本计算 UTF-8 字符集的字符个数,而不是实际的字节数——也就是说,要固定一行显示 25 个 UTF-8 字符,而不是 75 个字节。只要把
    text = temp_story.slice!(0,75)
    这一行改为:
    text = temp_story.slice!(/.{25}?/)
    即可~
    这个方法有它的弊端,ASCII 字符宽度和汉字不一样,也不知道每个字符是不是固定宽度的,所以当英文啊数字啊很多的时候,一行就可能出现末尾空一大堆(因为 ASCII 字符宽度 < 汉字)
    要弄到完美的话,只能像 Window_Message 那样一个一个计算字符的宽度,算出一行中能容纳的最长的字符串……
    给一段例子代码好了(替换 update1 中的 for ... end),没有深入测试,参考大致的算法思路就行了:
    1.       (ref_bmp = @read_window.contents).font.size = 20
    2.       for fileline in r
    3.         chars = fileline.scan(/./)
    4.         chars_copy = chars.clone
    5.         len = width = 0
    6.         for char in chars_copy
    7.           width += ref_bmp.text_size(char).width
    8.           if width > 508
    9.             @real_text.push(chars.slice!(0, len).join)
    10.             width = len = 0
    11.             redo
    12.           end
    13.           len += 1
    14.         end
    15.         @real_text.push(chars.join)
    16.       end
    复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
73 小时
注册时间
2008-7-9
帖子
234
7
 楼主| 发表于 2009-9-13 04:42:03 | 只看该作者
原来如此。我都已经快放弃了……
非常感谢。
血瞳睨世

也来玩一下养小龙吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 11:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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