找回密码
 注册
查看: 2548|回复: 26
打印 上一主题 下一主题

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

  [复制链接]
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    跳转到指定楼层
    1#
    发表于 2022-4-1 20:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    本帖最后由 db-_- 于 2022-4-2 10:35 编辑

    众所周知,在控制台输入以下代码,可以将汉字转为GBK编码,可以用于skill中显示、打印中文。
    1. <font size="3">axlUIPrompt("Code:",sprintf(nil,"%L",axlUIPrompt("Please Input Chinese:")))</font>
    复制代码
    但是17.2下面输入很多中文字都会显示错误的结果,该错误的结果虽然在17.2下也能运行,但在16.x下面会报错。

    比如输入中国,转换前:


    转换后:(错误示范)


    以下SKILL程序支持17.2,无乱码、支持特殊字符(比如斜杠)、支持GBK回转中文(比如看别人代码不知道表示什么中文),目前代码里最多支持512个中文、4096个字符。

    使用方法:附件解压到任意skill目录中。在allegro.ilinit中输入load("chinese2GBK.il")
    控制台中输入命令zw

    使用效果:


    非SKILL创作者不建议下载,下载了也没什么用。
    有任何问题欢迎指正、交流。

    附件:
    chinese2GBK.rar (1.8 KB, 下载次数: 21)



    补充内容 (2022-6-17 13:30):
    更新v1.2 见12楼

    补充内容 (2023-10-25 15:23):
    更新v1.3 见17楼或者置顶楼。

    评分

    参与人数 1威望 +2 收起 理由
    leilei4908 + 2 EDA365有你更精彩!

    查看全部评分

  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    来自 2#
     楼主| 发表于 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. ))
    复制代码


  • TA的每日心情
    慵懒
    2020-12-22 15:45
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    推荐
    发表于 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. ))
    复制代码


    该用户从未签到

    5#
    发表于 2022-4-2 09:31 | 只看该作者
    不错的分享,很实用

    该用户从未签到

    6#
    发表于 2022-4-11 23:13 | 只看该作者
    不错的分享,很实用
  • TA的每日心情
    开心
    2023-5-18 15:51
  • 签到天数: 63 天

    [LV.6]常住居民II

    7#
    发表于 2022-4-13 18:06 | 只看该作者
    好想看看~不知道繁體中文可嗎?貢獻不夠都看不到~
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    8#
     楼主| 发表于 2022-4-13 18:51 | 只看该作者
    本帖最后由 db-_- 于 2022-4-13 19:22 编辑
    selena19730105 发表于 2022-04-13 18:06:37
    好想看看~不知道繁體中文可嗎?貢獻不夠都看不到~

    支持繁体中文。。很多繁体中文的八进制ASCII码第二个byte会小于127,所以会出线八进制和字母或者符号连用的情况,是正常的,比如下图中的\363w。
    我又看了一下GBK的编码,所有文字都刻意避开了0x7F、0xFF,所以不可能出现不可见字符,请放心使用。




    “来自电巢APP”

  • TA的每日心情
    慵懒
    2020-12-22 15:45
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    11#
    发表于 2022-6-16 11:51 | 只看该作者
    16.6下加载报错

    W- *WARNING* (reader): string terminated by illegal char \267 at line 140 of file chinese2GBK.il
    E-
    E-                                 printf("
    E-                                         ^
    E- SYNTAX ERROR found at line 140 column 13 of file chinese2G
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    12#
     楼主| 发表于 2022-6-16 16:33 | 只看该作者
    Newroomantics 发表于 2022-6-16 11:51
    16.6下加载报错

    W- *WARNING* (reader): string terminated by illegal char \267 at line 140 of file  ...

    挺奇怪的,所有代码行都没有\267 这个字符, 而且 printf也全都加了注释了才对。

    我测试了16.6下也没问题。

    你下载的il再发给我试试。kittledeng@126.com
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    13#
     楼主| 发表于 2022-6-17 13:29 | 只看该作者
    把这几行改一下吧
    1.   if(dec < 127 then
    2.                         if(ch == '\\ || ch == '\" then        ;斜杠单独处理
    3.                                 tmp = strcat("\\" ch)
    4.             else if(ch == '\r then
    5.                 tmp = "\\n"
    6.                               
    7.                            
    8.                         else
    9.                                 tmp = ch        ;字母就用symbol或者string
    10.                         ))
    11.                 else
    12.                         tmp = sprintf(nil "\\%o" dec)        ;中文用八进制
    13.                 )
    复制代码
    chinese2GBK.rar (1.83 KB, 下载次数: 16)

  • TA的每日心情
    慵懒
    2020-12-22 15:45
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    14#
    发表于 2022-6-30 16:05 | 只看该作者
    今天用的时候发现,16.6版本下,复制代码的函数axlClipboardGetText用不了,set也用不了;
    这两个函数是17.2专有的吗,还是大佬自己写的
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    15#
     楼主| 发表于 2022-6-30 17:01 | 只看该作者
    Newroomantics 发表于 2022-6-30 16:05
    今天用的时候发现,16.6版本下,复制代码的函数axlClipboardGetText用不了,set也用不了;
    这两个函数是17 ...

    我这测试16.6也能复制。
    是不是你那边补丁版本有点低。
    16.6的HELP里确实没找到这个函数,17.2里面有,是误打误撞刚好16.6也能用。
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    16#
     楼主| 发表于 2023-1-12 19:09 | 只看该作者
    有没有用繁体系统的朋友,能帮忙反馈一下输入中国,得到的编码是什么吗?

    貌似繁体系统用的是BIG5编码,所以很有可能返回的是 对应的BIG5编码。

    简体系统下的繁体字和繁体系统下的繁体字编码应该是不一样的。
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    17#
     楼主| 发表于 2023-1-12 20:52 | 只看该作者
    OK,在繁體系統上測試了一下,輸出的就是BIG5的編碼。
    所以其實這個工具會根據不同的系統輸出適應於自己系統的對應編碼。

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

    本版积分规则

    EDA365公众号

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

    GMT+8, 2024-11-23 04:04 , Processed in 0.109375 second(s), 33 queries , Gzip On.

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

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

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