明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1917|回复: 18

[提问] 如何得到TXT文件的编码格式信息?

[复制链接]
发表于 2023-4-4 23:45:06 | 显示全部楼层 |阅读模式
如题,在不知道TXT编码格式的情况下,需要先知道编码格式信息,再以这种格式打开TXT文件,读写信息,如何实现?
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-4-7 16:21:08 | 显示全部楼层
写个函数判断一下(有BOM的自行处理):
  1. (defun Is_UTF8_No_BOM (str / is_UTF8 loop)
  2.   (setq is_UTF8 t
  3.         loop t
  4.   )
  5.   (while (and str loop)
  6.      (cond ((< (car str) 128) (setq str (cdr str)))  ;; 小于0x80为ACSCII字符
  7.            ((< (car str) 192) (setq is_UTF8 nil loop nil))  ;;(11000000) 介于0x80和0xC0之间的为无效的UTF-8字符
  8.            ((< (car str) 224)  ;;此范围为2字节UTF-8字符
  9.               (if (<= (length str) 1)
  10.                   (setq is_UTF8 nil loop nil)
  11.                   (if (/= (logand (cadr str) 192) 128) ;;_else  (str[1] & 0xC0 != 0x80)
  12.                       (setq is_UTF8 nil loop nil) ;;不符合
  13.                       (setq str (cddr str))  ;;_else 继续
  14.                   )
  15.               )  ;;if
  16.            )
  17.            ((< (car str) 240)  ;;(11110000) 此范围为3字节UTF-8字符
  18.               (if (<= (length str) 2)
  19.                   (setq is_UTF8 nil loop nil)
  20.                   (if (or (/= (logand (cadr str) 192) 128) (/= (logand (caddr str) 192) 128)) ;;_else  
  21.                       (setq is_UTF8 nil loop nil) ;;不符合
  22.                       (setq str (cdddr str))  ;;_else 继续
  23.                   )
  24.               )        
  25.            )
  26.            (t (setq is_UTF8 nil loop nil))
  27.      )
  28.   )
  29.   is_UTF8
  30. )
发表于 2023-4-6 16:17:42 | 显示全部楼层
UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在编译带有BOM的UTF-8源文件时就会出错。而且BOM去掉了UTF-8一个期望的特性,即是在文本全部是ASCII字符时UTF-8是和ASCII一致的,即UTF-8向下兼容ASCII。

在具体判断时,如果文档不带有BOM,就无法根据BOM做出判断,而且IsTextUnicode API也无法对UTF-8编码的Unicode字符串做出判断。那在编程判断时就要根据UTF-8字符编码的规律进行判断了。

UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:

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

这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode Explained"一书中的6.4.3。另外BOM本身也符合3字节UTF-8字符编码规律
 楼主| 发表于 2023-4-5 10:55:37 | 显示全部楼层
飞雪神光 发表于 2023-4-5 09:38
没听说过可以分编码格式打开txt文件的  都是直接读取的  你读到乱码了还是读不出来 发文件出来看看

http://bbs.mjtd.com/forum.php?mo ... hlight=%B1%E0%C2%EB
看该贴的xshrimp回复的沙发层,可以识别编码,但没有提供源码
发表于 2023-4-5 09:38:51 | 显示全部楼层
没听说过可以分编码格式打开txt文件的  都是直接读取的  你读到乱码了还是读不出来 发文件出来看看
发表于 2023-4-5 11:28:54 | 显示全部楼层
那你为什么要以特定格式打开这么做呢 txt读到乱码了还是读不出来 发文件出来看看呢
 楼主| 发表于 2023-4-5 14:40:54 | 显示全部楼层
飞雪神光 发表于 2023-4-5 11:28
那你为什么要以特定格式打开这么做呢 txt读到乱码了还是读不出来 发文件出来看看呢

文件就是普通的windows操作系统下创建的UTF-8编码格式的TXT文件,用read-line读后,中文字符都是乱码。
发表于 2023-4-5 16:18:47 | 显示全部楼层
weilu 发表于 2023-4-5 14:40
文件就是普通的windows操作系统下创建的UTF-8编码格式的TXT文件,用read-line读后,中文字符都是乱码。

不会啊 是你电脑的问题吧 要不就是 文件本身就是乱码
发表于 2023-4-5 16:21:55 | 显示全部楼层
还有一种情况就是繁体中文 UTF-8编码格式下就是乱码 编码改为ANSI才行
发表于 2023-4-5 20:49:13 | 显示全部楼层
weilu 发表于 2023-4-5 14:40
文件就是普通的windows操作系统下创建的UTF-8编码格式的TXT文件,用read-line读后,中文字符都是乱码。

是的,要知道编码 用ADO读取就可以转换成正常的字符串,但是都不如用lisp生成txt保险,肯定能正常读取
 楼主| 发表于 2023-4-5 22:27:36 | 显示全部楼层
飞雪神光 发表于 2023-4-5 16:18
不会啊 是你电脑的问题吧 要不就是 文件本身就是乱码

看看这个,win10系统下的TXT文件

本帖子中包含更多资源

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

x
发表于 2023-4-6 08:04:07 | 显示全部楼层
是编码的问题 需要另存为ANSI才行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 11:51 , Processed in 0.175555 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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