找回密码
 注册
楼主: db-_-
打印 上一主题 下一主题

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

  [复制链接]
  • TA的每日心情
    擦汗
    2023-1-7 15:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    16#
    发表于 2023-1-12 22:12 | 只看该作者
    XXXXXXXXXX
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    17#
     楼主| 发表于 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
  • TA的每日心情
    开心
    2024-11-26 15:32
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    19#
    发表于 2023-10-25 15:53 | 只看该作者
    db-_- 发表于 2023-10-25 15:18
    v1.3更新
    文件名 "chinese2GBK.il"

    感谢感谢
  • TA的每日心情
    奋斗
    2025-4-23 15:54
  • 签到天数: 170 天

    [LV.7]常住居民III

    20#
    发表于 2023-10-25 15:54 | 只看该作者
    学习了,谢谢分享

    该用户从未签到

    21#
    发表于 2023-11-8 10:37 | 只看该作者
    非常不错,想要但没有威望

    点评

    代码都贴出来了 不需要威望  详情 回复 发表于 2023-11-8 11:20
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    22#
     楼主| 发表于 2023-11-8 11:20 | 只看该作者
    quickly666 发表于 2023-11-8 10:37
    非常不错,想要但没有威望

    代码都贴出来了 不需要威望

    该用户从未签到

    23#
    发表于 2024-5-10 19:56 | 只看该作者
    db-_- 发表于 2023-10-25 15:18
    v1.3更新
    文件名 "chinese2GBK.il"

    真的很棒,高人啊!
  • TA的每日心情
    无聊
    2025-5-16 15:22
  • 签到天数: 34 天

    [LV.5]常住居民I

    24#
    发表于 2024-8-7 15:38 | 只看该作者
    樓主一生平安~
  • TA的每日心情
    开心
    2024-8-26 15:26
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    25#
    发表于 2024-8-13 15:27 | 只看该作者
    666666666666666666
  • TA的每日心情
    开心
    2021-1-19 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    26#
    发表于 2024-9-28 11:37 | 只看该作者
    大佬,膜拜

    “来自电巢APP”

  • TA的每日心情
    开心
    2021-1-19 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    27#
    发表于 2024-10-19 19:57 | 只看该作者
    谢谢分享已经使用,效果很好????

    “来自电巢APP”

  • TA的每日心情
    开心
    2025-5-24 15:11
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    28#
    发表于 2025-4-1 17:45 | 只看该作者
    感谢大佬的分享,效果非常好!
  • TA的每日心情
    郁闷
    2025-5-14 15:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    29#
    发表于 2025-5-26 18:40 | 只看该作者
    请教一下,知道GBK的编码,如何添加中文 文本呀?

    点评

    你是指在控制台或者FORM里打印出来,还是在PCB里面添加中文丝印? 前者的话,直接用printf打印就行,后者很复杂,甚至可以说和GBK编码没任何关系,而是需要一笔一划画出来。  详情 回复 发表于 2025-5-26 18:50
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    30#
     楼主| 发表于 2025-5-26 18:50 | 只看该作者
    Allen1211 发表于 2025-5-26 18:40
    请教一下,知道GBK的编码,如何添加中文 文本呀?

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

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-5-29 05:05 , Processed in 0.078125 second(s), 21 queries , Gzip On.

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

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

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