明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: tryhi

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

    [复制链接]
发表于 2019-11-1 11:47 | 显示全部楼层
是否可以逆转的呢?
发表于 2020-2-13 22:45 | 显示全部楼层
tryhi 发表于 2016-4-23 16:27
这是由论坛陈佳进写的,调用JScript对字符串与unicode互转的函数,这个很不错

我执行不知道为什么会出错?cad2018
“; 错误: 出现异常: 0xC0000005 (访问冲突)
; 警告: 忽略展开 异常
; 错误: 出现异常: 0xC0000005 (访问冲突)”
发表于 2020-6-9 22:17 | 显示全部楼层
借这个主题请教一个问题,问题的背景公司一直专情于cad2010无update的那个版本,这个版本有个麻烦,就是一些字符(比如钢板厚度符号δ)应该是以unicode代码格式存储(我也是猜的,理由是保存为cad2004版本图纸中的那些符号就显示unicode代码,然后lisp获取文字的时候就会出错),我像请问下怎么识别这种情况,在lisp获取文字的时候能够识别这些代码替换成正确的字符。升级cad2010 updadte2可以避免这个问题,但是公司打死都不升级,我写的一些代码就无法正确的使用。比如我要计算钢板的重量,需要识别厚度符号δ  就经常识别不出来,然后计算错误。
 楼主| 发表于 2020-6-10 16:17 | 显示全部楼层
本帖最后由 tryhi 于 2020-6-10 16:18 编辑

我觉得不是unicode的问题,你读一下组码,vl-string->list看一下是不是(166 196),是的话就用这个来识别
发表于 2020-6-11 21:30 | 显示全部楼层
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代码的形式存储的
发表于 2020-6-14 23:53 | 显示全部楼层
直接在命令行
输入 (strlen "δ") 是 7,而在lsp里面(strlen "δ") 显示就是2
在命令行可以用 (vl-string-search "δ" gbttext)找到 "δ" ,而在lip文件里面就找不到
只能用(vl-string-search "\\U+03B4" gbttext)找到"δ"
还有一个麻烦
当版本转换后,有时候他会自动切换,有时候他又不自动替换,时灵时不灵的那种感觉 真的很无奈
 楼主| 发表于 2020-6-15 21:49 | 显示全部楼层
muwind 发表于 2020-6-14 23:53
直接在命令行
输入 (strlen "δ") 是 7,而在lsp里面(strlen "δ") 显示就是2
在命令行可以用 (vl-stri ...


1、直接在命令行 输入 (strlen "δ") 是 7,而在lsp里面(strlen "δ") 显示就是2
证明你在命令输入的δ是UTF-8,而lsp文件里面的ASCII,我觉得你可以做一个双重判断来解决这个问题
发表于 2020-6-15 22:07 | 显示全部楼层
tryhi 发表于 2020-6-15 21:49
1、直接在命令行 输入 (strlen "δ") 是 7,而在lsp里面(strlen "δ") 显示就是2
证明你在命令输入的 ...

嗯  我只是举个例 还有别的符号也有同样的问题(比如乘号×,其他希腊字母等),如果双重判断有点麻烦呢,不知道能不能转码
发表于 2020-6-27 21:29 | 显示全部楼层
tryhi 发表于 2020-6-15 21:49
1、直接在命令行 输入 (strlen "δ") 是 7,而在lsp里面(strlen "δ") 显示就是2
证明你在命令输入的 ...

最后请教下,我现在直接在lisp代码里面一个一个的替换....
      (while   (vl-string-search "\\U+03B4" PlateTxt)
                   (setq PlateTxt  (vl-string-subst  "δ"  "\\U+03B4"   PlateTxt) )
         )
      (while   (vl-string-search "\\U+00D7" PlateTxt)
                   (setq PlateTxt  (vl-string-subst  "×"  "\\U+00D7"   PlateTxt) )
         )
不知道能不能批量的干?
发表于 2020-7-21 11:05 | 显示全部楼层
我也来一个十六进制字符串转十进制数
  1. (defun hex2dec(hex / map lst len p)
  2.   (setq map '(48 49 50 51 52 53 54 55 56 57 65 66 67 68 69 70))
  3.   (setq lst (mapcar '(lambda(x)(vl-position x map)) (vl-string->list (strcase hex))))
  4.   (setq len (length lst))
  5.   (setq p 0)
  6.   (if (< len 8)
  7.     (apply '+ (mapcar '(lambda(x)(lsh x (* 4 (- len (setq p (1+ p)))))) lst))
  8.     "最多转7位16进制字符串"
  9.   )
  10. )

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-7 07:50 , Processed in 0.185332 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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