找回密码
 注册
关于网站域名变更的通知

[SKILL分享]:汉字转码工具 源码(GBK编码和中文互转)

查看数: 4504 | 评论数: 31 | 收藏 8
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-4-1 20:16

正文摘要:

本帖最后由 db-_- 于 2022-4-2 10:35 编辑 众所周知,在控制台输入以下代码,可以将汉字转为GBK编码,可以用于skill中显示、打印中文。 <font size="3">axlUIPrompt("Code:",sprintf(nil,"%L",ax ...

回复

db-_- 发表于 2023-10-25 15:18
v1.3更新
文件名 "chinese2GBK.il"

  1. ;;v1.3 修正BUG
  2. ;;v1.2 统一格式
  3. ;;v1.1 增加引号处理
  4. ;;v1.0 初稿

  5. axlCmdRegister("zw" 'dbChinese2Gbk)

  6. ;;---------------------------------------------------------
  7. ;; skill load "chinese2GBK.il"
  8. ;;指令: zw
  9. ;;功能: 中文转GBK
  10. ;;描述: v1.3
  11. ;; 输入中文,点击代码框,然后点击复制即可
  12. ;; 输入代码,点击中文框,可以转换成中文
  13. ;; 如果系统是繁体中文,则不是GBK,而是BIG5编码
  14. ;; 支持17.2
  15. ;;---------------------------------------------------------

  16. ;;主函数
  17. procedure(dbChinese2Gbk()
  18. (let (addr)
  19.     ;创建FORM
  20.     addr = "./ch2gbk.form"
  21.     _dbCreatChisese2GbkForm(addr)
  22.     fm_zw = axlFormCreate((gensym) addr '("C") '_dbChinese2GbkCallback t nil)
  23.     when(isFile(addr) errset(deleteFile(addr)))
  24.     axlFormDisplay(fm_zw)       ;显示form
  25.     axlUIWPrint(fm_zw "Author: db")
  26. ))

  27. ;;创建form
  28. defun(_dbCreatChisese2GbkForm (addr)
  29. (let (file)
  30.     ;输出文件
  31.     file = outfile(addr)

  32.     fprintf(file "FILE_TYPE=FORM_DEFN VERSION=2\n")
  33.     fprintf(file "FORM AUTOGREYTEXT\n")
  34.     fprintf(file "FIXED\n")
  35.     fprintf(file "PORT 55 20\n")            ;长,高
  36.     fprintf(file "HEADER \"Words to GBK code V1.3\"\n")

  37.     fprintf(file "TILE\n")

  38.     ;;文字1
  39.     fprintf(file "TEXT \"Words: \"\n")
  40.     fprintf(file "FLOC 2 2\n")
  41.     fprintf(file "ENDTEXT\n")
  42.     ;;编辑框1
  43.     fprintf(file "FIELD zw_ch_text\n")
  44.     fprintf(file "FLOC 13 1\n")
  45.     fprintf(file "STRFILLIN 26 4096\n") ;4096最多支持4096/8=512个数字,可以改大,但不知道上限是多少
  46.     fprintf(file "FSIZE 40 4\n")
  47.     fprintf(file "ENDFIELD\n")
  48.     ;;文字2
  49.     fprintf(file "TEXT \"GBK code: \"\n")
  50.     fprintf(file "FLOC 2 7\n")
  51.     fprintf(file "ENDTEXT\n")
  52.     ;;编辑框2
  53.     fprintf(file "FIELD zw_gbk_code\n")
  54.     fprintf(file "FLOC 13 6\n")
  55.     fprintf(file "STRFILLIN 26 4096\n") ;4096最多支持4096/8=512个数字,可以改大,但不知道上限是多少
  56.     fprintf(file "FSIZE 40 4\n")
  57.     fprintf(file "ENDFIELD\n")
  58.     ;;按钮0
  59.     fprintf(file "FIELD zw_clear\n")
  60.     fprintf(file "FLOC 10 11\n")
  61.     fprintf(file "MENUBUTTON \"Clear\" 12 4\n")
  62.     fprintf(file "ENDFIELD\n")
  63.     ;;按钮1
  64.     fprintf(file "FIELD zw_copy\n")
  65.     fprintf(file "FLOC 30 11\n")
  66.     fprintf(file "MENUBUTTON \"Copy code\" 12 4\n")
  67.     fprintf(file "ENDFIELD\n")

  68.     fprintf(file "ENDTILE\n")

  69.     fprintf(file "ENDFORM\n")

  70.     close(file)
  71. ))

  72. ;;form响应函数
  73. defun(_dbChinese2GbkCallback (fm_zw)
  74. (prog (values)

  75.     axlUIWPrint(fm_zw "Author: db")
  76.     case(fm_zw->curField
  77.         ("zw_ch_text"   ;输入中文,转换GBK
  78.             values = axlFormGetField(fm_zw "zw_ch_text")
  79.             when(values
  80.                 axlFormSetField(fm_zw "zw_gbk_code" _dbChn2Gbk(values))
  81.             )
  82.         )
  83.         ("zw_gbk_code"  ;输入GBK,转换中文
  84.             values = axlFormGetField(fm_zw "zw_gbk_code")
  85.             when(values
  86.                 axlFormSetField(fm_zw "zw_ch_text" _dbGbk2Chn(values))
  87.             )
  88.         )
  89.         ("zw_clear" ;清除
  90.             axlFormSetField(fm_zw "zw_ch_text" nil)
  91.             axlFormSetField(fm_zw "zw_gbk_code" nil)
  92.         )
  93.         ("zw_copy"  ;复制
  94.             when(axlClipboardGetText() != axlFormGetField(fm_zw "zw_gbk_code")
  95.                 when(axlClipboardSetText(axlFormGetField(fm_zw "zw_gbk_code"))
  96.                     axlUIWPrint(nil 'info0 "The code had copied to the clipboard.")
  97.                 )
  98.             )
  99.         )
  100.     )
  101.     if((nequal fm_zw->doneState 0)  then
  102.         axlFormClose(fm_zw)
  103.     )
  104.     return()
  105. ))

  106. defun(_dbChn2Gbk (str)
  107. (let (res ch dec tmp)
  108.     res = ""
  109.     for(i 1 strlen(str)
  110.         ch = getchar(str i)
  111.         dec = charToInt(ch)
  112.         if(dec < 127 then
  113.             if(ch == '\\ || ch == '\" then  ;斜杠单独处理,后面加个杠
  114.                 tmp = strcat("\\" ch)
  115.             else if(ch == '\r then  ;换行转成\n
  116.                 tmp = "\\n"
  117.             else if(ch == '\t then  ;换行转成\t
  118.                 tmp = "\\t"
  119.             else
  120.                 tmp = ch    ;字母就用symbol或者string
  121.             )))
  122.         else
  123.             tmp = sprintf(nil "\\%o" dec)   ;中文用八进制
  124.         )
  125.         res = strcat(res tmp)
  126.     )
  127.     res
  128. ))

  129. defun(_dbGbk2Chn (str)
  130. (let (res ch dec old cnt numVlue)
  131.     old = nil
  132.     cnt = 0
  133.     numVlue = ""
  134.     res = ""
  135.     for(i 1 strlen(str)
  136.         ch = getchar(str i)
  137.         dec = charToInt(ch)
  138.         cond(
  139.             (old != 92 ;上一个不是斜杆
  140.                 old = dec
  141.                 when(dec != 92              ;当前也不是斜杠
  142.                     res = strcat(res ch)
  143.                 )
  144.             )
  145.             (old == 92 ;上一个是斜杆
  146.                 old = dec
  147.                 cond(
  148.                     (dec <= 57 && dec >= 48 ;上一个是斜杠,这个是数字
  149.                         numVlue = strcat(numVlue ch)
  150.                         cnt = cnt + 1
  151.                         if(cnt == 3 then
  152.                             res = strcat(res intToChar(_dbOct2Dec( atoi(numVlue))))
  153.                             numVlue = ""
  154.                             cnt = 0
  155.                         else
  156.                             old = 92
  157.                         )
  158.                     )
  159.                     (ch == 'n || ch == 'r
  160.                         res = strcat(res '\r)
  161.                     )
  162.                     (ch == 't
  163.                         res = strcat(res '\t)
  164.                     )
  165.                     (t
  166.                         res = strcat(res ch)
  167.                     )
  168.                 )                  
  169.             )
  170.         )
  171.     )
  172.     res
  173. ))

  174. defun(_dbOct2Dec (num)
  175. (let (n cnt x)
  176.    
  177.     n = num
  178.     cnt = 1
  179.     x = 0
  180.     while(n > 0
  181.         x = x + mod(n 10) * cnt
  182.         n = n / 10
  183.         cnt = cnt * 8
  184.     )
  185.     x
  186. ))
复制代码


点评

真的很棒,高人啊!  详情 回复 发表于 2024-5-10 19:56
感谢感谢  详情 回复 发表于 2023-10-25 15:53
Newroomantics 发表于 2022-6-17 11:11
db-_- 发表于 2022-6-16 16:33
挺奇怪的,所有代码行都没有\267 这个字符, 而且 printf也全都加了注释了才对。

我测试了16.6下也没 ...

好像找到问题了,是那一行printf直接写了中文的原因,发现引号;不知道是不是大佬发错版本了
  1. defun(_dbChn2Gbk (str)
  2. (let (res i ch dec tmp)
  3.         res = ""
  4.         for(i 1 strlen(str)
  5.                 ch = getchar(str i)
  6.                 dec = charToInt(ch)
  7.                 if(dec < 127 then
  8.                         if(dec == 92 then        ;斜杠单独处理
  9.                                 tmp = "\\\\"
  10.                         else if(dec == 34 then        ;引号单独处理
  11.                                 tmp = "\\\""
  12.                                 printf("发现引号%L\n" dec)
  13.                                 printf("tmp = %L\n" tmp)
  14.                         else
  15.                                 tmp = ch        ;字母就用symbol或者string
  16.                         ))
  17.                 else
  18.                         tmp = sprintf(nil "\\%o" dec)        ;中文用八进制
  19.                 )
  20.                 res = strcat(res tmp)
  21.         )
  22.         res
  23. ))
复制代码


Allen1211 发表于 2025-7-1 09:47
db-_- 发表于 2025-5-26 18:50
你是指在控制台或者FORM里打印出来,还是在PCB里面添加中文丝印?

前者的话,直接用printf打印就行, ...

我想的是后者,谢谢 我知道了。
db-_- 发表于 2025-5-26 18:57
db-_- 发表于 2022-4-13 18:51
支持繁体中文。。很多繁体中文的八进制ASCII码第二个byte会小于127,所以会出线八进制和字母或者符号连用 ...

补充一下如果你的系统是简体系统,生成的自然就是GBK编码;如果你的系统是繁体系统,生成的是BIG5编码,这两是不互通的。


(简体系统下输入繁体字生成的编码也是GBK编码的,而不是BIG5。)


如果你用GBK编码写代码,用繁体系统的人打开就会是乱码;
如果你用BIG5写代码,用简体系统的人打开也会是乱码;




想要实现全覆盖,只能根据检测到的系统,做适配。


如何检测你是简体系统还是繁体系统,可以在cmd里面输入chcp.com,显示936就是简体系统了。显示950就是繁体系统了。再复杂的就不再深究的,感兴趣的可以去搜索研究一下。
  1. C:\Users\kd_20>chcp.com
  2. 活动代码页: 936
复制代码
所以使用BIG5编码的童鞋们,见到乱码的SKILL也不要觉得奇怪了。
db-_- 发表于 2025-5-26 18:50
Allen1211 发表于 2025-5-26 18:40
请教一下,知道GBK的编码,如何添加中文 文本呀?

你是指在控制台或者FORM里打印出来,还是在PCB里面添加中文丝印?

前者的话,直接用printf打印就行,后者很复杂,甚至可以说和GBK编码没任何关系,而是需要一笔一划画出来。

点评

我想的是后者,谢谢 我知道了。  详情 回复 发表于 2025-7-1 09:47
Allen1211 发表于 2025-5-26 18:40
请教一下,知道GBK的编码,如何添加中文 文本呀?

点评

你是指在控制台或者FORM里打印出来,还是在PCB里面添加中文丝印? 前者的话,直接用printf打印就行,后者很复杂,甚至可以说和GBK编码没任何关系,而是需要一笔一划画出来。  详情 回复 发表于 2025-5-26 18:50
Xin-O 发表于 2025-4-1 17:45
感谢大佬的分享,效果非常好!
gogogo冲冲冲 发表于 2024-10-19 19:57
谢谢分享已经使用,效果很好????

“来自电巢APP”

gogogo冲冲冲 发表于 2024-9-28 11:37
大佬,膜拜

“来自电巢APP”

dianchao240711 发表于 2024-8-13 15:27
666666666666666666
雞翅加辣 发表于 2024-8-7 15:38
樓主一生平安~
delray 发表于 2024-5-10 19:56
db-_- 发表于 2023-10-25 15:18
v1.3更新
文件名 "chinese2GBK.il"

真的很棒,高人啊!
db-_- 发表于 2023-11-8 11:20
quickly666 发表于 2023-11-8 10:37
非常不错,想要但没有威望

代码都贴出来了 不需要威望
quickly666 发表于 2023-11-8 10:37
非常不错,想要但没有威望

点评

代码都贴出来了 不需要威望  详情 回复 发表于 2023-11-8 11:20
七彩雨 发表于 2023-10-25 15:54
学习了,谢谢分享
Flower98 发表于 2023-10-25 15:53
db-_- 发表于 2023-10-25 15:18
v1.3更新
文件名 "chinese2GBK.il"

感谢感谢
db-_- 发表于 2023-10-25 15:20
关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-22 02:09 , Processed in 0.187500 second(s), 34 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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