找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4159|回复: 4

[教学] Autolisp读写文本文件的编码问题

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2019-10-23 21:23:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
Autocad 中 autolisp 是ANSI处理字符串
_$ (strlen "晓东CAD")
7

一个汉字是两个字节,vl-string->list 对非 ASCII 字符中文系统下得到的是 GBK 编码,不是 UNICODE

_$ (vl-string->list "晓东")
(207 254 182 171) => CF FE B6 AB

通过这个网址可以查询
https://www.qqxiuzi.cn/bianma/zifuji.php

对文本文件的读写,autolisp 提供的是 read-line/write-line 和 read-char/write-char ,read-line 读取是按 ANSI 格式读取,中文 Windows 下 用记事本保存时一般有四种格式选择, ANSI / UTF-8 / Unicode / Unicode big endian ,如果要读取的文件是 ANSI 格式,不管里面是否有中文都可以正确读取,如果是后面三种格式使用 read-line 就可能读取出来的是乱码。

使用二进制编辑器打开文本文件,按 HEX 模式查看,可以看到文件的编码格式,下表是常见的几种编码格式

tb.jpg

在 Autolisp 中 使用 read-char 读入前面几个字节就可你判断该文本文件的编码格式:

UTF-8 ->  239 187 191
Unicode -> 255 254
Unicode big endian -> 254 255

read-char 读出来的是 10 进制格式

对于 UTF-8 和 Unicode 格式文件, Autolisp 要正确读取可以采用
1 使用外部工具将文本文件转换为 ANSI 格式,如记事本
2 使用 read-char 读取后再行处理


UTF-8 格式文本文件
read-char 读取后按 UTF-8 编码规则,127 及以下为单字节,以上是三个字节表示一个字符,可以将三个数转换为一个整数,然后再转换为 HEX 的Unicode 形式

Unicode 及 Unicode big endian 格式就是大数一个在前一个在后,read-char 读取后去掉格式头,后面的表两两一组,由 十进制数转换为 HEX 就是字符的 Unicode 码

最后 Unicode 码转换为易懂的字串,不考虑外部工具,在Autocad内实现就用  Entmakex + 宋体 写入 \\u+XXXX ,然后用 entget 取出字符串,entdel 清理掉临时实体。

UTF-8 编码转 int

  1. (defun ul2i (a b c / d e)
  2.   (setq        d (lsh (logand a 31) 12)
  3.         e (logior d (lsh (logand b 63) 6))
  4.   )
  5.   (logior e (logand c 63))
  6. )




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1344个

财富等级: 财源广进

发表于 2019-10-23 21:49:43 | 显示全部楼层
本帖最后由 279491611 于 2019-10-23 21:51 编辑

请教一下,写入文本,保存时怎样设置文件编码为UTF-8?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2019-10-23 22:04:03 | 显示全部楼层
用 read-char 读取 utf-8 格式文件,读出来的是什么形式就还按什么形式用 write-char 写回去

点评

把CAD中提取的文本,比如说坐标,写入CSV文本,用UTF-8 格式保存。你的意思是先新建一个utf-8编码的文件,用 read-char 读取,然后替换掉内容。再用 write-char 写回去保存?  详情 回复 发表于 2019-10-23 22:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1344个

财富等级: 财源广进

发表于 2019-10-23 22:38:05 | 显示全部楼层
st788796 发表于 2019-10-23 22:04
用 read-char 读取 utf-8 格式文件,读出来的是什么形式就还按什么形式用 write-char 写回去

把CAD中提取的文本,比如说坐标,写入CSV文本,用UTF-8 格式保存。你的意思是先新建一个utf-8编码的文件,用 read-char 读取,然后替换掉内容。再用 write-char 写回去保存?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2021-1-25 15:02:12 | 显示全部楼层
本帖最后由 aeo 于 2021-1-25 15:13 编辑

UTF-8编码的文件,有两种,上面ea写的是带BOM的文档,也就是以0xEF, 0xBB, 0xBF 开头的文档。

还有一种是没BOM头的,如果全部是ascii范围的字符,那这个文档和ascii的文档一模一样,就是说一个字节表示一个字符的时候。

理论上UTF-8 可以一个字节到6个字节不等的长度,表示一个字。

规律是:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8并不是固定的长度表示一个文字,而是各种长度混杂在一起,所有应该按上面的规律决定读几个字节。
所以碰到0xEF, 0xBB, 0xBF 开头的文档就好处理了,但大多是没头的文档,只能按字节来判断。
windows新建文本默认是 UTF-8. 但写入很容易变成了带BOM。
不知道CAD写入可以怎么控制这个编码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 08:33 , Processed in 0.180977 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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