weilu 发表于 2023-4-4 23:45:06

如何得到TXT文件的编码格式信息?

如题,在不知道TXT编码格式的情况下,需要先知道编码格式信息,再以这种格式打开TXT文件,读写信息,如何实现?

小菜123 发表于 2023-4-7 16:21:08

写个函数判断一下(有BOM的自行处理):
(defun Is_UTF8_No_BOM (str / is_UTF8 loop)
(setq is_UTF8 t
      loop t
)
(while (and str loop)
   (cond ((< (car str) 128) (setq str (cdr str)));; 小于0x80为ACSCII字符
         ((< (car str) 192) (setq is_UTF8 nil loop nil));;(11000000) 介于0x80和0xC0之间的为无效的UTF-8字符
         ((< (car str) 224);;此范围为2字节UTF-8字符
            (if (<= (length str) 1)
                  (setq is_UTF8 nil loop nil)
                  (if (/= (logand (cadr str) 192) 128) ;;_else(str & 0xC0 != 0x80)
                      (setq is_UTF8 nil loop nil) ;;不符合
                      (setq str (cddr str));;_else 继续
                  )
            );;if
         )
         ((< (car str) 240);;(11110000) 此范围为3字节UTF-8字符
            (if (<= (length str) 2)
                  (setq is_UTF8 nil loop nil)
                  (if (or (/= (logand (cadr str) 192) 128) (/= (logand (caddr str) 192) 128)) ;;_else
                      (setq is_UTF8 nil loop nil) ;;不符合
                      (setq str (cdddr str));;_else 继续
                  )
            )      
         )
         (t (setq is_UTF8 nil loop nil))
   )
)
is_UTF8
)

baitang36 发表于 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字符编码规律

weilu 发表于 2023-4-5 10:55:37

飞雪神光 发表于 2023-4-5 09:38
没听说过可以分编码格式打开txt文件的都是直接读取的你读到乱码了还是读不出来 发文件出来看看

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=82886&highlight=%B1%E0%C2%EB
看该贴的xshrimp回复的沙发层,可以识别编码,但没有提供源码

飞雪神光 发表于 2023-4-5 09:38:51

没听说过可以分编码格式打开txt文件的都是直接读取的你读到乱码了还是读不出来 发文件出来看看

飞雪神光 发表于 2023-4-5 11:28:54

那你为什么要以特定格式打开这么做呢 txt读到乱码了还是读不出来 发文件出来看看呢

weilu 发表于 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才行

liuhe 发表于 2023-4-5 20:49:13

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

是的,要知道编码 用ADO读取就可以转换成正常的字符串,但是都不如用lisp生成txt保险,肯定能正常读取

weilu 发表于 2023-4-5 22:27:36

飞雪神光 发表于 2023-4-5 16:18
不会啊 是你电脑的问题吧 要不就是 文件本身就是乱码

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

飞雪神光 发表于 2023-4-6 08:04:07

是编码的问题 需要另存为ANSI才行
页: [1] 2
查看完整版本: 如何得到TXT文件的编码格式信息?