明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2997|回复: 37

[经验] 如何正确使用中文变量或者中文函数

[复制链接]
发表于 2021-8-5 22:44:53 | 显示全部楼层 |阅读模式
本帖最后由 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去处理中文


注:以上的结论是猜测



评分

参与人数 2明经币 +2 金钱 +50 收起 理由
USER2128 + 1 很给力!
xtjd + 1 + 50 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2023-3-26 17:29:52 | 显示全部楼层
nuan1989 发表于 2023-3-26 14:29
大佬, 你啥版本, 我下载下来试试

cad2007...
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-3-26 12:44:24 | 显示全部楼层
nuan1989 发表于 2023-3-26 00:26
为啥我这边测试都没问题. 可以正常输出.
cad2021.

2021之后的版本修复了可能
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-26 00:26:22 | 显示全部楼层
为啥我这边测试都没问题. 可以正常输出.
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,异常
发表于 2021-8-6 00:08:08 | 显示全部楼层
学习了,海哥~

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
tryhi + 1 + 50

查看全部评分

发表于 2021-8-6 08:19:56 | 显示全部楼层
学习了,通俗易懂的讲解,谢谢大师!

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
tryhi + 1 + 50

查看全部评分

发表于 2021-8-6 08:54:37 | 显示全部楼层
本帖最后由 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,正常。这三个汉字的编码第一个字节是相同的,第二个字节不同,说明第一个字节确实是被忽略的。

点评

白糖厉害  发表于 2024-6-14 23:43

评分

参与人数 1明经币 +1 金钱 +50 收起 理由
tryhi + 1 + 50 大神从编译角度研究一遍,佩服

查看全部评分

发表于 2021-8-6 09:06:18 | 显示全部楼层
非得用汉字吗  用拼音不好嘛
 楼主| 发表于 2021-8-6 09:36:12 | 显示全部楼层
xj6019 发表于 2021-8-6 09:06
非得用汉字吗  用拼音不好嘛

不懂拼音、不懂英语,全篇都是var-1,var-2,aaa,xxx之类的,你说难受不?
发表于 2021-8-6 10:08:10 | 显示全部楼层
tryhi 发表于 2021-8-6 09:36
不懂拼音、不懂英语,全篇都是var-1,var-2,aaa,xxx之类的,你说难受不?

在fas中,变量和函数都是符号 symbol,字符串是string。
字符串string写入文件是可以用二进制数据的,只是需要显示的时候不行。
 楼主| 发表于 2021-8-6 10:14:18 | 显示全部楼层
baitang36 发表于 2021-8-6 08:54
试验了一下
(setq 左 "1" 前 "2" 方 "3")
(princ (strcat "\n" 左 前 方));返回123,居然也是正常的。

好像也不算是被忽略,哪个先出现,就以哪个为准,比如“后”先出现,“左”变成“后”,还有这个规律也特别奇怪,只忽略第一个出现的双字节字符

点评

这算不算bug  发表于 2022-7-13 20:35
发表于 2021-8-6 10:24:12 | 显示全部楼层
本帖最后由 baitang36 于 2021-8-6 10:27 编辑
tryhi 发表于 2021-8-6 10:14
好像也不算是被忽略,哪个先出现,就以哪个为准,比如“后”先出现,“左”变成“后”,还有这个规律也特 ...

是的,编译的时候只保留第一个相同字符串,后面相同的就被忽略。桌子有点歧视汉字,它的hash计算函数竟然把汉字都当成是问号来计算,一个汉字的两个字节当成一个问号。只改汉字,hash值不变。
发表于 2021-8-6 10:49:53 | 显示全部楼层
研究总结出来就是:桌子歧视汉字。

点评

也可能人家只是懒  发表于 2021-8-9 19:10
桌子确实歧视汉字  发表于 2021-8-6 11:10
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:59 , Processed in 0.213171 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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