设为首页收藏本站帮助中心
查看: 88|回复: 4
收起左侧

Keil BUG 解决部分汉字字符串编译出现乱码 0xFD 0FDH汉字补丁PHP&易语言版

[复制链接]
发表于 2020-7-20 21:03:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?加入我们

x
Keil 字符串编译时会将汉字的 FD 内码忽略,受影响的汉字:

  1. 三 数 正 她 升 引 饼 昌 除 待 谍 洱 俘 庚 过 糊 积 箭 烬 君 魁 例 笼 慢 谬
  2. 凝 琵 讫 驱 褒 听 妄 锡 淆 旋 妖 育 札 铸 佚 冽 邶 埤 荦 蔟 摭 啐 帻 猃 恺
  3. 泯 潺 妪 纨 琮 椠 辇 挲 臊 忑 睚 铨 稞 瘕 颀 螨 簖 酏 觚 鳊 鼾
复制代码

C:

  1. #include "reg51.h"
  2. unsigned char code *text = "AAAA三个数ZZZZ";
  3. void main() {
  4.         P0 = text[0];
  5.         while (1);
  6. }
复制代码

ASM:

  1. DB "三个数"
  2. END
复制代码

编译结果:
C.png
ASM.png
修复方法:
方法1:用16进制编辑器打开 X:\Keil\C51\BIN\ 目录下的 A51.exe、C51.exe 文件,将16进制数据 80FBFD 替换为 80FBFF 保存即可。
方法2:使用PHP修改,粘贴以下源码保存到 X:\Keil\C51\BIN\ 目录,使用 php.exe 运行:
  1. <?php
  2. if(isset($_SERVER['SERVER_PORT'])){
  3.         header('Content-type:text/html;charset=gb2312');
  4.         exit('请将本文件保存到 X:\Keil\C51\BIN\ 目录下,并使用 php.exe 运行。');
  5. }

  6. exec('chcp 936');
  7. echo "\r\n";
  8. define('C',__DIR__.'/C51.exe');
  9. define('A',__DIR__.'/A51.exe');
  10. define('CB',__DIR__.'/C51.exe.bak');
  11. define('AB',__DIR__.'/A51.exe.bak');
  12. define('_80FBFD',chr(0x80).chr(0xFB).chr(0xFD));
  13. define('_80FBFF',chr(0x80).chr(0xFB).chr(0xFF));

  14. function stop($text){
  15.         echo $text;
  16.         sleep(3);
  17.         exit('');
  18. }

  19. if(!file_exists(C) || !file_exists(A)){
  20.         stop('找不到 C51.exe 以及 A51.exe 请将本文件保存到 X:\Keil\C51\BIN\ 目录下。');
  21. }elseif(file_exists(CB) || file_exists(AB)){
  22.         stop('C51.exe.bak 或 A51.exe.bak 备份文件已存在。');
  23. }

  24. define('CD',file_get_contents(C));
  25. define('AD',file_get_contents(A));

  26. if(strpos(CD,_80FBFD) === false){
  27.         stop('C51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。');
  28. }elseif(strpos(AD,_80FBFD) === false){
  29.         stop('A51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。');
  30. }elseif(@file_put_contents(CB,CD) == false){
  31.         stop('C51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。');
  32. }elseif(@file_put_contents(AB,AD) == false){
  33.         stop('A51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。');
  34. }elseif(file_put_contents(C,str_replace(_80FBFD,_80FBFF,CD)) == false) {
  35.         stop('C51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。');
  36. }elseif(file_put_contents(A,str_replace(_80FBFD,_80FBFF,AD)) == false) {
  37.         stop('A51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。');
  38. }

  39. stop('打补丁成功! 如有问题可将 .bak 文件改名还原。');

  40. ?>
复制代码

方法3:修改程序源码,对受影响的汉字尾部加 \xFD 字样:

  1. #include "reg51.h"
  2. unsigned char code *text = "AAAA三\xFD个数\xFDZZZZ";
  3. void main() {
  4.         P0 = text[0];
  5.         while (1);
  6. }
复制代码

方法4:使用易语言修改:

  1. .版本 2

  2. .程序集 程序集1

  3. .子程序 输出文本
  4. .参数 文本, 文本型

  5. 信息框 (文本, 0, , )
  6. 结束 ()


  7. .子程序 _启动子程序, 整数型
  8. .局部变量 C, 文本型, , , C51.exe 路径
  9. .局部变量 A, 文本型, , , A51.exe 路径
  10. .局部变量 CB, 文本型, , , C51.exe.bak 路径
  11. .局部变量 AB, 文本型, , , A51.exe.bak 路径
  12. .局部变量 CD, 字节集, , , C51.exe 数据
  13. .局部变量 AD, 字节集, , , A51.exe 数据
  14. .局部变量 _80FBFD, 字节集
  15. .局部变量 _80FBFF, 字节集

  16. C = 取运行目录 () + “\C51.exe”
  17. A = 取运行目录 () + “\A51.exe”
  18. CB = 取运行目录 () + “\C51.exe.bak”
  19. AB = 取运行目录 () + “\A51.exe.bak”
  20. _80FBFD = { 128, 251, 253 }
  21. _80FBFF = { 128, 251, 255 }
  22. .判断开始 (文件是否存在 (C) = 假 或 文件是否存在 (A) = 假)
  23.     输出文本 (“找不到 C51.exe 以及 A51.exe 请将本文件保存到 X:\Keil\C51\BIN\ 目录下。”)
  24.     返回 (0)
  25. .判断 (文件是否存在 (CB) 或 文件是否存在 (AB))
  26.     输出文本 (“C51.exe.bak 或 A51.exe.bak 备份文件已存在。”)
  27. .默认

  28. .判断结束
  29. CD = 读入文件 (C)
  30. AD = 读入文件 (A)
  31. .判断开始 (寻找字节集 (CD, _80FBFD, ) = -1)
  32.     输出文本 (“C51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。”)
  33. .判断 (寻找字节集 (AD, _80FBFD, ) = -1)
  34.     输出文本 (“A51.exe 未找到[80 FB FD]字段,可能已打过补丁或无法识别的新版本。”)
  35. .判断 (写到文件 (CB, CD) = 假)
  36.     输出文本 (“C51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。”)
  37. .判断 (写到文件 (AB, AD) = 假)
  38.     输出文本 (“A51.exe.bak 写入失败,请检查是否有写入权限,并以管理员身份运行。”)
  39. .判断 (写到文件 (C, 子字节集替换 (CD, _80FBFD, _80FBFF, , )) = 假)
  40.     输出文本 (“C51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。”)
  41. .判断 (写到文件 (A, 子字节集替换 (AD, _80FBFD, _80FBFF, , )) = 假)
  42.     输出文本 (“A51.exe 写入失败,请检查是否有写入权限,退出Keil软件并以管理员身份运行。”)
  43. .默认

  44. .判断结束
  45. 输出文本 (“打补丁成功! 如有问题可将 .bak 文件改名还原。”)
  46. 返回 (0)
复制代码

方法5:使用以下应用程序修改:

exe.png
keilfdfix.zip (97.19 KB, 下载次数: 8)

相关帖子

这个小可爱很神秘,什么都没留下
回复

使用道具 举报

发表于 2020-7-29 20:12:02 | 显示全部楼层
1心1亿 发表于 2020-7-21 23:27
lz会几套编程语言

板块有啥ta会啥
这个小可爱很神秘,什么都没留下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则