明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10631|回复: 32

[函数] 进制转换与编码转换

    [复制链接]
发表于 2016-4-18 23:31:35 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2016-4-23 16:28 编辑

今天群友在问关于UTF-8格式的文本如何读取问题,自己写了几条相关函数,可能日后有可能用到,虽然暂时还不是非常完善
注:将Unicode转换为ASCII编码需要加载"简体汉字unicode转GBK.lsp"常量的支持

10进制转二进制
2进制转10进制
16进制转10进制
10进制转16进制
UTF-8编码转Unicode
UTF-8编码转GKB编码
  1. ;;10进制转二进制 BY:大海
  2. ;;返回一个2进制字符串
  3. ;;例子:(try-10-to-2 8);-->"1000"
  4. (defun try-10-to-2(n / m x)
  5.   (setq x "")
  6.   (while (/= 0 n)
  7.     (setq
  8.       m(rem n 2)
  9.       n(/ n 2)
  10.       x(strcat (itoa m)x)
  11.     )
  12.   )
  13.   (if (= "" x)"0"x)
  14. )

  15. ;;2进制转10进制 BY:大海
  16. ;;返回一个整数型的值
  17. ;;例子:(try-2-to-10 "1000");-->8
  18. (defun try-2-to-10 (n / f i j m)
  19.   (setq i (strlen n) m 0 j 0)
  20.   (repeat i
  21.     (setq
  22.       f(substr n i 1)
  23.       m(+ m (* (expt 2 j) (atoi f)))
  24.       i(1- i)
  25.       j(1+ j)
  26.     )
  27.   )
  28.   m
  29. )

  30. ;;16进制转10进制 BY:大海
  31. ;;返回一个整数型的值
  32. ;;例子:(try-16-to-10 "1F");-->31
  33. (defun try-16-to-10 (n / 16-10 f i ii j m)
  34.   (setq i 0 j (strlen n)m 0
  35.     16-10 '(("0"0)("1"1)("2"2)("3"3)("4"4)("5"5)("6"6)("7"7)("8"8)("9"9)("A"10)("B"11)("C"12)("D"13)("E"14)("F"15))
  36.   )
  37.   (repeat j
  38.     (setq
  39.       f(substr n j 1)
  40.       ii(cadr(assoc f 16-10))
  41.       m(+ m (* (expt 16 i) ii))
  42.       i(1+ i)
  43.       j(1- j)
  44.     )
  45.   )
  46.   m
  47. )

  48. ;;10进制转16进制 BY:大海
  49. ;;返回一个16进制字符串
  50. ;;例子:(try-10-to-16 31);-->"1F"
  51. (defun try-10-to-16(n / 10-16 m n16x x)
  52.   (setq x "" 10-16 '((0"0")(1"1")(2"2")(3"3")(4"4")(5"5")(6"6")(7"7")(8"8")(9"9")(10"A")(11"B")(12"C")(13"D")(14"E")(15"F")))
  53.   (while (/= 0 n)
  54.     (setq
  55.       m(rem n 16)
  56.       n(/ n 16)
  57.       n16x(cadr(assoc m 10-16))
  58.       x(strcat n16x x)
  59.     )
  60.   )
  61.   (if (= x "")"0"x)
  62. )
  63. ;;UTF-8编码转Unicode BY:大海
  64. ;;(try-UTF8->Unicode '(233 155 133));-->(209 197)雅字UTF编码跟Unicode编码
  65. (defun try-UTF8->Unicode (lst / a1 a2 a3 b c1 c2)
  66.   (setq a1(substr (bu0 8(try-10-to-2 (car lst)))5)
  67.     a2(substr (bu0 8(try-10-to-2 (cadr lst)))3)
  68.     a3(substr (bu0 8(try-10-to-2 (caddr lst)))3)
  69.     b(strcat a1 a2 a3)
  70.     c1(substr b 1 8)
  71.     c2(substr b 9))
  72.   (list (try-2-to-10 c1)(try-2-to-10 c2))
  73. )
  74. ;;UTF-8编码转GKB编码 BY:大海
  75. ;;参数:由3个字节的十进制编码
  76. ;;例子:"雅"字的UTF8编码为233 155 133,GKB编码为209 197
  77. ;;(vl-list->string(try-UTF8->GKB '(233 155 133)));-->"雅"
  78. (defun try-UTF8->GKB(lst / gbk h1 h2 nic nic-16 nicod)
  79.   (setq nic(try-UTF8->Unicode lst))
  80.   (setq nic-16(mapcar '(lambda(x)(bu0 2(try-10-to-16 x)))nic))
  81.   (setq nicod(strcat (car nic-16)(cadr nic-16)))
  82.   (setq gbk(cadr(assoc nicod *u2k*)))
  83.   (setq h1(try-16-to-10(substr gbk 1 2)))
  84.   (setq h2(try-16-to-10(substr gbk 3 2)))
  85.   (list h1 h2)
  86. )
  87. ;;补零
  88. (defun bu0 (n0 num / _000)
  89.   (setq _000 "")
  90.   (repeat(- n0 (strlen num))(setq _000(strcat "0" _000)))
  91.   (strcat _000 num)
  92. )

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 很给力!
lucas_3333 + 1 神马都是浮云

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2016-4-23 16:27:24 | 显示全部楼层
  1. (defun n5-escape (x code / *ScriptControl)
  2.   (if (setq *ScriptControl
  3.              (vlax-get-or-create-object
  4.                "MSScriptControl.ScriptControl"
  5.              )
  6.       )
  7.     (progn
  8.     (vlax-put *ScriptControl 'Language "JScript")
  9.     (vlax-invoke *ScriptControl 'run (if code "escape""unescape") x)
  10.       )
  11.   )
  12. )
  13. (n5-escape "第五轻柔" t)
  14. (n5-escape "%u7B2C%u4E94%u8F7B%u67D4" nil)
这是由论坛陈佳进写的,调用JScript对字符串与unicode互转的函数,这个很不错

评分

参与人数 2明经币 +2 收起 理由
自贡黄明儒 + 1 赞一个!
highflybir + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2016-4-24 09:04:55 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2018-8-6 14:39 编辑

楼主来个应用实例吧!
  1. ;;10进制转换为2进制
  2. ;;(Dec2Bin 5)=> "101"
  3. (defun Dec2Bin (i / s)
  4.   (if (<= i 0)
  5.     "0"
  6.     (progn
  7.       (while (> i 0)
  8.         (setq s (cons (logand i 1) s))
  9.         (setq i (lsh i -1))
  10.       )
  11.       (apply 'strcat (mapcar 'itoa s))
  12.     )
  13.   )
  14. )
  15. ;;2进制转10进制
  16. ;;(Bin2Dec "1000")->8
  17. (defun Bin2Dec (n / f i j m)
  18.   (setq m 0)
  19.   (setq j -1)
  20.   (repeat (setq i (strlen n))
  21.     (setq f (atoi (substr n i 1)))        ;最后一位开始
  22.     (setq m (+ m (* (lsh 2 j) f)))
  23.     (setq i (1- i))
  24.     (setq j (1+ j))
  25.   )
  26.   m
  27. )
  28. ;;10进制转换为16进制
  29. ;;(Dec2Hex 21)->"15"
  30. (defun Dec2Hex (i / A S)
  31.   (if (<= i 0)
  32.     "0"
  33.     (progn
  34.       (while (> i 0)
  35.         (setq a (rem i 16))
  36.         (if (< a 10)
  37.           (setq s (cons (chr (+ 48 a)) s))
  38.           (setq s (cons (chr (+ 55 a)) s))
  39.         )
  40.         (setq i (lsh i -4))
  41.       )
  42.       (apply 'strcat s)
  43.     )
  44.   )
  45. )
  46. ;;16进制转10进制
  47. ;;(Hex2Dec "BCDE1");-->773601
  48. (setq n "1F")
  49. (defun Hex2Dec (n / F I J S)
  50.   (setq i 0)
  51.   (setq s 0)
  52.   (repeat (setq j (strlen n))
  53.     (setq f (ascii (substr n j 1)))
  54.     (if        (>= f 65)
  55.       (setq f (- f 55))
  56.       (setq f (- f 48))
  57.     )
  58.     (setq s (+ (* f (lsh 2 (1- (* 4 i)))) s))
  59.     (setq i (1+ i))
  60.     (setq j (1- j))
  61.   )
  62.   s
  63. )



发表于 2020-6-11 21:30:39 | 显示全部楼层
tryhi 发表于 2020-6-10 16:17
我觉得不是unicode的问题,你读一下组码,vl-string->list看一下是不是(166 196),是的话就用这个来识别

;以钢板的厚度字符"δ"说明。
——————————————————————————————
;首先第一段代码:获取文本
(cdr (assoc 1  (entget (car (entsel)))));选择单个图元
;运行结果:
;选择对象:"δ"
;看来获取的文本是没问题的
——————————————————————————————
;再看看这个"δ"的长度
(strlen (cdr (assoc 1  (entget (car (entsel))))))
;运行结果:
;选择对象:7
;"δ"居然是7个字节的,基本可以确定是unicode代码了
——————————————————————————————
;字符串转为字符代码表
(vl-string->list (cdr (assoc 1  (entget (car (entsel))))))
;运行结果:
;选择对象: (92 85 43 48 51 66 52)
;好吧,刚好7个数字,也就是占了7个字节的原因
——————————————————————————————
;下面看看数字都代表什么意思,
;
(foreach n  '(92 85 43 48 51 66 52) (print (chr n) ))
;运行结果
;"\\"
;"U"
;"+"
;"0"
;"3"
;"B"
;"4"
;连起来就是"\\U+03B4 "
——————————————————————————————
;到此基本结束了,从上面的测试看出,未打补丁的AutoCad2010对于一些字符的存储
方式比较比较特别,是用unicode代码的形式存储的
发表于 2016-4-23 08:29:52 | 显示全部楼层
一个字
看看
发表于 2016-4-23 13:12:38 来自手机 | 显示全部楼层
支持,好东西呀!
发表于 2017-8-30 09:31:52 | 显示全部楼层
请楼主谈谈转换的意义,是加快存储还是为了啥?
发表于 2017-8-30 10:11:03 | 显示全部楼层
我要支持一下
发表于 2017-9-20 16:43:46 | 显示全部楼层
好东西支持顶一下
发表于 2017-10-4 15:44:50 | 显示全部楼层
感谢楼主分享 谢谢大师
发表于 2017-10-29 15:20:13 | 显示全部楼层
16进制"BFEBFBFF000506E3"转10进制为329443
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-28 04:40 , Processed in 0.182201 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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