明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 980|回复: 11

[函数] 按指定编码格式读取文本文件并返回内容

  [复制链接]
发表于 2022-5-21 20:24 | 显示全部楼层 |阅读模式
本帖最后由 小菜123 于 2022-5-22 16:34 编辑

解决UTF-8等文本文件读入乱码问题
  1. ;;;by小菜 测试 (read_txt_file_as_encoding "f:\\test.txt" "utf-8")
  2. (defun read_txt_file_as_encoding (FileName encoding / bstr stream byxiaocai)
  3.     (setq stream (vlax-create-object "ADODB.Stream"))
  4.     (vlax-put-Property stream 'type 2)
  5.     (Vlax-Put-Property stream 'Charset encoding)
  6.     (Vlax-Invoke stream 'open)
  7.     (vlax-invoke-method stream 'LoadFromFile FileName)
  8.     (setq bstr (Vlax-Invoke-Method stream 'readtext -1))
  9.     (Vlax-Invoke-Method stream 'close)
  10.     (vlax-release-object stream)
  11.     bstr
  12. )


评分

参与人数 2明经币 +2 金钱 +10 收起 理由
weilu + 1 + 10 很给力!
baitang36 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2023-4-10 20:49 | 显示全部楼层
本帖最后由 小菜123 于 2023-4-11 20:12 编辑

另一个帖子也讨论到这个问题,正好完善一下以前的函数
http://bbs.mjtd.com/thread-187537-1-1.html


  1. (defun detect_encoding (file / encoding stm_obj str)  
  2.   (setq stm_obj (vlax-create-object "Adodb.Stream"))
  3.   (vlax-put-property stm_obj 'type 1)
  4.   (vlax-put-property stm_obj 'mode 3)
  5.   (vlax-invoke-method stm_obj 'open nil nil nil nil nil)
  6.   (vlax-put-property stm_obj 'position 0)
  7.   (vlax-invoke-method stm_obj 'loadfromfile file)
  8.   (setq str (vlax-invoke-method stm_obj 'read nil))
  9.   (vlax-release-object stm_obj)
  10.   (setq str (vlax-safearray->list (vlax-variant-value str)))
  11.   (cond  ((and (= (car str) 239) (= 187 (cadr str)) (= 191 (caddr str)))  ;;根据文件头判断,0xEF 0xBB 0xBF为UTF-8
  12.    (setq encoding "UTF-8")
  13.   )
  14.   ((and (= (car str) 255) (= 254 (cadr str))) ;;0xFF 0xFE 为Unicode (LE)
  15.    (setq encoding "Unicode") ;;"UTF-16LE"
  16.   )
  17.   ((and (= (car str) 254) (= 255 (cadr str)))  ;;0xFE 0xFF 为Unicode BE
  18.    (setq encoding "Unicode")  ;;utf-16be
  19.   )
  20.   ((Is_UTF8_No_BOM str) (setq encoding "UTF-8"))  ;;是否为没有BOM的UTF-8
  21.   (t (setq encoding "GB2312"))  
  22.   )
  23.   encoding
  24. )
  25. (defun Is_UTF8_No_BOM (str / is_UTF8 loop)
  26.   (setq is_UTF8 t
  27.   loop t
  28.   )
  29.   (while (and str loop)
  30.      (cond ((< (car str) 128) (setq str (cdr str)))  ;; 小于0x80为ACSCII字符
  31.      ((< (car str) 192) (setq is_UTF8 nil loop nil))  ;;(11000000) 介于0x80和0xC0之间的为无效的UTF-8字符
  32.      ((< (car str) 224)  ;;此范围为2字节UTF-8字符
  33.         (if (<= (length str) 1)
  34.       (setq is_UTF8 nil loop nil)
  35.       (if (/= (logand (cadr str) 192) 128) ;;_else  (str[1] & 0xC0 != 0x80)
  36.           (setq is_UTF8 nil loop nil) ;;不符合
  37.           (setq str (cddr str))  ;;_else 继续
  38.       )
  39.         )  ;;if
  40.      )
  41.      ((< (car str) 240)  ;;(11110000) 此范围为3字节UTF-8字符
  42.         (if (<= (length str) 2)
  43.       (setq is_UTF8 nil loop nil)
  44.       (if (or (/= (logand (cadr str) 192) 128) (/= (logand (caddr str) 192) 128)) ;;_else  (str[1] & 0xC0 != 0x80 || str[2] & 0xC0 != 0x80)
  45.           (setq is_UTF8 nil loop nil) ;;不符合
  46.           (setq str (cdddr str))  ;;_else 继续
  47.       )
  48.         )  
  49.      )
  50.      (t (setq is_UTF8 nil loop nil))
  51.      )
  52.   )
  53.   is_UTF8
  54. )


评分

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

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2022-5-22 11:50 | 显示全部楼层
谢谢菜总分享
发表于 2022-5-22 15:46 | 显示全部楼层
能否先自动判断编码方式,然后再决定是否采用呢?
 楼主| 发表于 2022-5-22 16:36 | 显示全部楼层
Bao_lai 发表于 2022-5-22 15:46
能否先自动判断编码方式,然后再决定是否采用呢?

理论上可以,但对于没有BOM标志的文件难度太大
发表于 2022-5-22 23:00 | 显示全部楼层
小菜123 发表于 2022-5-22 16:36
理论上可以,但对于没有BOM标志的文件难度太大

http://bbs.mjtd.com/forum.php?mo ... hlight=%B1%E0%C2%EB

点评

原来早就有人写好了,没有查过  发表于 2022-5-23 09:05
发表于 2023-3-19 19:21 | 显示全部楼层
求CAD属性块文字递增刷以及文字刷
 楼主| 发表于 2023-4-10 20:50 | 显示全部楼层
编码格式未知时用下面方式读取即可自动判断:
(read_txt_file_as_encoding FileName (detect_encoding FileName ))
发表于 2023-4-11 12:28 | 显示全部楼层
小菜123 发表于 2023-4-10 20:50
编码格式未知时用下面方式读取即可自动判断:
(read_txt_file_as_encoding FileName (detect_encoding File ...

测试了一下,(detect_encoding "D:\\图纸目录.txt")返回nil,不知何故,就是普通的txt文件

点评

有一处笔误,已改正  发表于 2023-4-11 20:13
发表于 2023-4-14 00:49 | 显示全部楼层
刚好最近遇到了这个问题,学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 16:00 , Processed in 0.609360 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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