【UTF8转码】使用最新fluffos驱动转码UTF-8详细过程记录

前言:因为之前论坛访问太卡,发布其他帖子时不知道触发了什么 Bug,导致之前的记录全部消失了。现在重新编辑发布此贴。

参考引用https://bbs.mud.ren/threads/85

此篇文档主要记录使用新驱动并将 Mudlib(即你的游戏服务端源码文件夹)转码为 UTF-8 的完整步骤。注意:本教程涵盖了最通用的修改方法,但由于各个 Mudlib 差异较大,可能并不完全适用所有底层架构,具体情况还需结合自身源码调整。


🛠️ 准备工作:必备工具下载与安装

在开始之前,请先下载以下必备工具(vscode和git可自行去官网下载):

⚠️ Git 安装注意事项: 安装 Git 时,请务必保证勾选添加 Git Bash Here 选项(如下图所示),因为后续执行脚本需要依赖此环境。其余安装步骤保持默认,一直点击“下一步”即可。

B.png


🚀 升级与转码详细步骤

第一步:代码全局 UTF-8 转码

首先,使用下载好的“转码神器”将整个源码目录转为 UTF-8 格式。操作步骤参考下图: a.png

💡 提示:如果你的 Mudlib 文件数量过于庞大,转码过程中可能会出现卡顿甚至报错失败的情况。不用担心,关闭软件重新尝试一次即可。

第二步:将 static 关键字替换为 nosaveprotected

在新的 FluffOS 驱动中,static 关键字已被废弃,需要根据其作用域分别替换。

1. 使用 Perl 脚本批量替换: 首先,在你的 Mudlib 根目录下新建一个名为 fixstatic.pl 的文件(注意扩展名一定要是 .pl,不要写错)。使用 VSCode 或记事本打开它,将以下代码粘贴进去并保存:

#!/usr/bin/perl -pi

if (/,/ || /=/) {
    s/static/nosave/;
}
elsif (/\([^{[:]/) {
    s/static/protected/;
}
elsif (/;/) {
    s/static/nosave/;
}
else {
    s/static/protected/;
}

2. 执行批量替换脚本: 在 Mudlib 根目录空白处点击鼠标右键,选择 Git Bash Here(如果你正确安装了 Git,右键菜单里会有这个选项)。

在打开的控制台窗口中输入以下命令并回车:

find . -name "*.c" -print | xargs /e/mudlib/fixstatic.pl

⚠️ 极其重要:命令中的 /e/mudlib/ 是脚本所在的绝对路径,请务必替换为你自己真实的 Mudlib 目录路径! 执行后需要耐心等待一小会儿,直到命令跑完。

3. 处理残留目录与手动检查:

  • 重命名目录:检查你的 Mudlib 中是否存在 log/static 这个目录,如果存在,请将其重命名为 log/nosave
  • VSCode 全局搜索扫尾:使用 VSCode 打开 Mudlib 目录,全局搜索关键字 static。 通常这里会列出所有依然包含 static 的文件,需要手动将其全部修改:
    • 如果是函数前缀,将 static 修改为:protected
    • 如果是变量前缀,将 static 修改为:nosave

4. 移除废弃的预处理与宏定义:

  • 清理预处理:在 VSCode 全局搜索中查找 #pragma save_binary。将替换的第二行输入框保持空白,点击右侧的“全部替换”按钮,将其彻底删除。最新的驱动如果保留这个指令,会一直报 Warning,部分环境甚至会导致无法运行。
  • 清理 globals.h 宏定义:检查你的 globals.h(或其他全局头文件),如果里面有将 static 宏定义为 nosaveprotected 的代码(如 #define static nosave),请直接将这行代码删掉。新驱动不再需要这种宏定义兼容。如果没有找到则无需理会。

第三步:修改部分核心 Simul_Efun 函数

1. 修改 /adm/simul_efun/message.c 将文件中的 message 函数修改为以下代码,防止因为参数缺失报错:

varargs void message(mixed arg, string message, mixed target, mixed exclude)
{
    efun::message(arg, message, target, exclude || ({}));
}

2. 修改 /adm/simul_efun/chinese.c 将文件中的 is_chinese 函数修改为以下代码,以完美支持 UTF-8 的正则匹配:

int is_chinese(string str)
{
     if (!str)
          return 0;

      return pcre_match(str, "^\\p{Han}+$");
}

3. 清理自定义时间函数 在很多老旧的 Mudlib 的 Simul_efun 文件夹(如 /adm/simul_efun/ 目录下的所有文件)中,为了将时区转为中国时区,人为定义了 time()localtime() 作为 sfun。 修改方案:最新的驱动默认就已经支持并配置为了中国时区!所以只要在这个文件夹里找到了自定义的 time()localtime(),可以直接删除,使用驱动原生的 efun 即可。

4. 修改 /adm/single/master.c 中的日志拦截log_error 函数修改为如下代码,对 Warning 进行分流处理:

void log_error(string file, string message)
{
    if (strsrch(message, "Warning") == -1)
    {
        // 记录严重错误日志
        efun::write_file(LOG_DIR + "log_error", message);
    }
    else
    {
        // 记录警告日志(如果不想看警告,可以注释掉下面这行代码,这样就不再记录警告日志,但控制台和 debug.log 依然会显示)
        efun::write_file(LOG_DIR + "log", message);
    }
}

如果不做此修改,可能会导致游戏中屏幕无限刷 Warning 提示,极度影响体验。

📌 补充:其他的函数如 strwidth()strlen() 的修改细节,可以参考雪风大佬教程中的详细内容:雪风大佬的UTF8转码教程

第四步:完善头文件 (.h) 的防重复编译机制

为了代码的健壮性,需要为 zjmud.hglobals.hansi.h 等核心头文件增加对应的预处理宏(Include Guards)。 在这些文件的最顶部添加:

#ifndef _XXX_H
#define _XXX_H

在文件的最底部(最后一行)添加:

#endif

(注:XXX 请自行定义,通常建议使用大写的文件名,例如 _GLOBALS_H,主要是为了防止该头文件被多重包含导致重复编译冲突。)


✅ 收尾与调试建议

到这里,基础的升级转码工作基本就结束了。

接下来的工作就是启动游戏服务端,然后根据 debug.log 或控制台提示的错误,逐个去修复。因为各个版本的 Mudlib 差异巨大,本教程仅梳理了最通用的修改方案,那些特定的业务逻辑错误还需要大家自己动手排查。

关于 Warning 的小建议: 一些 Warning 其实并不影响游戏的正常运行。如果你实在是有强迫症不想看到它们,可以在 globals.h 文件头部增加一行 #pragma no_warnings 来全局屏蔽警告。不过作为开发者,强烈不建议这么做。一个干净、稳定、高效的 Mudlib 一定要保持代码洁癖,把 Warning 当作 Error 去修复才是正道!

💬 技术交流与求助 如果在升级过程中遇到棘手的底层问题,或者有需要我帮忙处理的,可以联系我:279631638(QQ)。


🎁 推广:提升 MUD 开发幸福感的 VSCode 插件

另外,强烈向大家推广一下我自己开发的 VSCode 插件,专为 LPC 语言与 MUD 开发打造,能极大地提升你的编程体验!

👉 插件名称LPC-Server-UPDATE MUD工具 👉 下载/安装地址点击此处下载 (也可在 VSCode 扩展商店直接搜索安装:LPC-Server-UPDATE MUD工具)

核心功能包括但不限于:

  • 远程 Update:一键热更新远程服务器代码,告别繁琐的指令输入。
  • 自动函数声明:保存文件时自动提取函数并在顶部生成声明块。
  • 一键路径复制/常用文件收藏:大幅减少文件树查找时间。
  • 开源安全:插件完全开源,纯本地处理代码逻辑,绝对不会上传任何敏感信息,可前往 GitHub 仓库查阅源码。
京ICP备13031296号-4