如何正确使用中文变量或者中文函数
本帖最后由 tryhi 于 2021-8-6 10:56 编辑很多人都知道使用lsp不要用中文变量或者中文函数,但是没人解释为什么,只是说“有可能”出错,似乎从来没人说过什么情况下出错,那我们来看下面几个例子
(setq 左 "1" 后 "2" 审 "3")
(princ (strcat "\n" 左 后 审));返回333,即CAD认为这三个变量是同一个变量
(setq 越 "1" 山 "2" 咏 "3")
(princ (strcat "\n" 越 后 咏));返回333,结果同上
(setq 左左 "1" 后后 "2" 审审 "3")
(princ (strcat "\n" 左左 后后 审审));这次用叠字,返回123,居然是正常的
(setq a左 "1" a后 "2" a审 "3")
(princ (strcat "\n" a左 a后 a审));返回333,异常
(setq 左1 "1" 后1 "2" 审1 "3")
(princ (strcat "\n" 左1 后1 审1));返回333,异常
(setq 左1天天b "1" 后1天天b "2" 审1天天b "3")
(princ (strcat "\n" 左1天天b 后1天天b 审1天天b));返回333,异常
(mapcar 'vl-string->list '("左""后""审"));返回((215 243) (186 243) (201 243)),第二字节相同都是243
(mapcar 'vl-string->list '("越""山""咏"));返回((212 189) (201 189) (211 189)),第二字节相同都是189
得出一条结论,变量里面的第一个双字节文字,其第一个字节将会被CAD忽略
由此得出几个避免错误的方法,
1、在使用带中文的变量时,至少存在两个不同的中文,可避免错误;
2、或者至少存在一个不同的普通字符,可避免错误;
3、所有的中文变量前面都加一个固定的双字节符号,可保证不出错,比如加上双字节的感叹号、句号、人民币符号等
另外千万不要用read去处理中文。
注:以上的结论是猜测
nuan1989 发表于 2023-3-26 14:29
大佬, 你啥版本, 我下载下来试试
cad2007... nuan1989 发表于 2023-3-26 00:26
为啥我这边测试都没问题. 可以正常输出.
cad2021.
2021之后的版本修复了可能 为啥我这边测试都没问题. 可以正常输出.
cad2021.
以下我这测试, 全部输出的都是123
----------------------
(setq 左 "1" 后 "2" 审 "3")
(princ (strcat "\n" 左 后 审));返回333,即CAD认为这三个变量是同一个变量
(setq 越 "1" 山 "2" 咏 "3")
(princ (strcat "\n" 越 后 咏));返回333,结果同上
(setq 左左 "1" 后后 "2" 审审 "3")
(princ (strcat "\n" 左左 后后 审审));这次用叠字,返回123,居然是正常的
(setq a左 "1" a后 "2" a审 "3")
(princ (strcat "\n" a左 a后 a审));返回333,异常
(setq 左1 "1" 后1 "2" 审1 "3")
(princ (strcat "\n" 左1 后1 审1));返回333,异常
(setq 左1天天b "1" 后1天天b "2" 审1天天b "3")
(princ (strcat "\n" 左1天天b 后1天天b 审1天天b));返回333,异常 学习了,海哥~ 学习了,通俗易懂的讲解,谢谢大师! 本帖最后由 baitang36 于 2021-8-6 08:59 编辑
试验了一下
(setq 左 "1" 前 "2" 方 "3")
(princ (strcat "\n" 左 前 方));返回123,居然也是正常的。
把(setq 左 "1" 后 "2" 审 "3")这一句编译一下,发现里面只有 左 这个符号,后和审没有,被丢掉了。
也就是说问题出在编译过程中,编译程序在归并字符串时,把左后审当成相同的字符,进行了归并。
如果把编译后的fas中左前方改成左后审,程序还是会正常运行的。
汉字编码 左 5D F3 后BA F3 审C9 F3,里面都带了一个F3,只要两个字节都不同,cad还是能分辨的。
(setq 左 "1" 昨 "2" 遵 "3")
(princ (strcat "\n" 左 昨 遵));返回123,正常。这三个汉字的编码第一个字节是相同的,第二个字节不同,说明第一个字节确实是被忽略的。
非得用汉字吗用拼音不好嘛 xj6019 发表于 2021-8-6 09:06
非得用汉字吗用拼音不好嘛
不懂拼音、不懂英语,全篇都是var-1,var-2,aaa,xxx之类的,你说难受不? tryhi 发表于 2021-8-6 09:36
不懂拼音、不懂英语,全篇都是var-1,var-2,aaa,xxx之类的,你说难受不?
在fas中,变量和函数都是符号 symbol,字符串是string。
字符串string写入文件是可以用二进制数据的,只是需要显示的时候不行。 baitang36 发表于 2021-8-6 08:54
试验了一下
(setq 左 "1" 前 "2" 方 "3")
(princ (strcat "\n" 左 前 方));返回123,居然也是正常的。
好像也不算是被忽略,哪个先出现,就以哪个为准,比如“后”先出现,“左”变成“后”,还有这个规律也特别奇怪,只忽略第一个出现的双字节字符 本帖最后由 baitang36 于 2021-8-6 10:27 编辑
tryhi 发表于 2021-8-6 10:14
好像也不算是被忽略,哪个先出现,就以哪个为准,比如“后”先出现,“左”变成“后”,还有这个规律也特 ...
是的,编译的时候只保留第一个相同字符串,后面相同的就被忽略。桌子有点歧视汉字,它的hash计算函数竟然把汉字都当成是问号来计算,一个汉字的两个字节当成一个问号。只改汉字,hash值不变。 研究总结出来就是:桌子歧视汉字。