进制转换与编码转换
本帖最后由 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编码;;10进制转二进制 BY:大海
;;返回一个2进制字符串
;;例子:(try-10-to-2 8);-->"1000"
(defun try-10-to-2(n / m x)
(setq x "")
(while (/= 0 n)
(setq
m(rem n 2)
n(/ n 2)
x(strcat (itoa m)x)
)
)
(if (= "" x)"0"x)
)
;;2进制转10进制 BY:大海
;;返回一个整数型的值
;;例子:(try-2-to-10 "1000");-->8
(defun try-2-to-10 (n / f i j m)
(setq i (strlen n) m 0 j 0)
(repeat i
(setq
f(substr n i 1)
m(+ m (* (expt 2 j) (atoi f)))
i(1- i)
j(1+ j)
)
)
m
)
;;16进制转10进制 BY:大海
;;返回一个整数型的值
;;例子:(try-16-to-10 "1F");-->31
(defun try-16-to-10 (n / 16-10 f i ii j m)
(setq i 0 j (strlen n)m 0
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))
)
(repeat j
(setq
f(substr n j 1)
ii(cadr(assoc f 16-10))
m(+ m (* (expt 16 i) ii))
i(1+ i)
j(1- j)
)
)
m
)
;;10进制转16进制 BY:大海
;;返回一个16进制字符串
;;例子:(try-10-to-16 31);-->"1F"
(defun try-10-to-16(n / 10-16 m n16x x)
(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")))
(while (/= 0 n)
(setq
m(rem n 16)
n(/ n 16)
n16x(cadr(assoc m 10-16))
x(strcat n16x x)
)
)
(if (= x "")"0"x)
)
;;UTF-8编码转Unicode BY:大海
;;(try-UTF8->Unicode '(233 155 133));-->(209 197)雅字UTF编码跟Unicode编码
(defun try-UTF8->Unicode (lst / a1 a2 a3 b c1 c2)
(setq a1(substr (bu0 8(try-10-to-2 (car lst)))5)
a2(substr (bu0 8(try-10-to-2 (cadr lst)))3)
a3(substr (bu0 8(try-10-to-2 (caddr lst)))3)
b(strcat a1 a2 a3)
c1(substr b 1 8)
c2(substr b 9))
(list (try-2-to-10 c1)(try-2-to-10 c2))
)
;;UTF-8编码转GKB编码 BY:大海
;;参数:由3个字节的十进制编码
;;例子:"雅"字的UTF8编码为233 155 133,GKB编码为209 197
;;(vl-list->string(try-UTF8->GKB '(233 155 133)));-->"雅"
(defun try-UTF8->GKB(lst / gbk h1 h2 nic nic-16 nicod)
(setq nic(try-UTF8->Unicode lst))
(setq nic-16(mapcar '(lambda(x)(bu0 2(try-10-to-16 x)))nic))
(setq nicod(strcat (car nic-16)(cadr nic-16)))
(setq gbk(cadr(assoc nicod *u2k*)))
(setq h1(try-16-to-10(substr gbk 1 2)))
(setq h2(try-16-to-10(substr gbk 3 2)))
(list h1 h2)
)
;;补零
(defun bu0 (n0 num / _000)
(setq _000 "")
(repeat(- n0 (strlen num))(setq _000(strcat "0" _000)))
(strcat _000 num)
) (defun n5-escape (x code / *ScriptControl)
(if (setq *ScriptControl
(vlax-get-or-create-object
"MSScriptControl.ScriptControl"
)
)
(progn
(vlax-put *ScriptControl 'Language "JScript")
(vlax-invoke *ScriptControl 'run (if code "escape""unescape") x)
)
)
)
(n5-escape "第五轻柔" t)
(n5-escape "%u7B2C%u4E94%u8F7B%u67D4" nil)这是由论坛陈佳进写的,调用JScript对字符串与unicode互转的函数,这个很不错 本帖最后由 自贡黄明儒 于 2018-8-6 14:39 编辑
楼主来个应用实例吧!
;;10进制转换为2进制
;;(Dec2Bin 5)=> "101"
(defun Dec2Bin (i / s)
(if (<= i 0)
"0"
(progn
(while (> i 0)
(setq s (cons (logand i 1) s))
(setq i (lsh i -1))
)
(apply 'strcat (mapcar 'itoa s))
)
)
)
;;2进制转10进制
;;(Bin2Dec "1000")->8
(defun Bin2Dec (n / f i j m)
(setq m 0)
(setq j -1)
(repeat (setq i (strlen n))
(setq f (atoi (substr n i 1))) ;最后一位开始
(setq m (+ m (* (lsh 2 j) f)))
(setq i (1- i))
(setq j (1+ j))
)
m
)
;;10进制转换为16进制
;;(Dec2Hex 21)->"15"
(defun Dec2Hex (i / A S)
(if (<= i 0)
"0"
(progn
(while (> i 0)
(setq a (rem i 16))
(if (< a 10)
(setq s (cons (chr (+ 48 a)) s))
(setq s (cons (chr (+ 55 a)) s))
)
(setq i (lsh i -4))
)
(apply 'strcat s)
)
)
)
;;16进制转10进制
;;(Hex2Dec "BCDE1");-->773601
(setq n "1F")
(defun Hex2Dec (n / F I J S)
(setq i 0)
(setq s 0)
(repeat (setq j (strlen n))
(setq f (ascii (substr n j 1)))
(if (>= f 65)
(setq f (- f 55))
(setq f (- f 48))
)
(setq s (+ (* f (lsh 2 (1- (* 4 i)))) s))
(setq i (1+ i))
(setq j (1- j))
)
s
)
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代码的形式存储的 一个字
看看 支持,好东西呀! 请楼主谈谈转换的意义,是加快存储还是为了啥? 我要支持一下 好东西支持顶一下 感谢楼主分享 谢谢大师 16进制"BFEBFBFF000506E3"转10进制为329443