【杂谈1】

giscus是什么?

[23-11-10/15:42]

在老胡的周刊上看项目,看到页面底部的时候,想给周刊点个赞。它说要我登录,我一点,弹出个页面几个显眼大字“giscus by giscus would like permission to:”,然后下面列了它想要的各种权限。这英文我看不懂,查了一下字典,没查到,正纳闷呢,于是直接去搜索引擎查。
然后查到这个链接,似乎是个项目,又开了一个别人的博客,我才明白giscus是个评论引擎。

如上面链接里所讲的,giscus是一款基于GitHub Discussions实现的评论系统,让别人可以通过GitHub给你的博客评论。

仔细看看,giscus这个名字应该是git和discuss的混合体。

以前确实没想到这种博客评论功能都有拿来即用的引擎,还没有做自己的博客,或许以后自己建站的时候可能会考虑到用一下这东西吧。

UTF-8和UTF-8 DOM有什么区别?

[23-11-10/22:15]

搞了一份别人的代码来用,结果用sublime打开之后中文注释全是乱码,代码文件是ANSI编码的。
经常遇到这种问题,虽然知道一点编码的知识,但疑惑的是UTF-8和ANSI都可以编码中文,为什么还要搞两种不一样的。
于是上B站搜了一下,一个叫#100.概念 编码 什么是 ANSI UTF-8 GBK ASCII编码-自举易语言的视频讲得还是挺明白的,ANSI居然是一种动态的解码方式,可能操作系统使用的语言不一样,显示出来的字符就不同了;而UTF-8则是写死的,不会因为操作系统语言的不同而改变解码方式。UTF-8中的中文占3个字节,ANSI则是2个。另外UTF-8同时也支持很多其他语言,比如日语什么的。

一开始想的是,能不能写个batch批量修改一下代码文件的编码格式。
于是找到了这个帖子(虽然很不想引用csdn的帖子,但没办法,就只在这里找到了我要的),用PowerShell语句type .\5.txt | Out-File -Encoding "utf-8" .\6.txt就可以实现(无语的是,如果不想改名字的话,也就是type 5.txt之后,保存给5.txt,那么文件里的东西就会被清空,所以只能换名字)。

然而,再用记事本打开改变编码的文件之后发现,右下角状态栏显示的编码格式并不是UTF-8,而是UTF-8 DOM。

还以为眼花了,但是确认之后才知道,原来这还真就有区别。

看了文章才知道,真的有区别,但区别不大。好像就是有BOM的话,在文件的开头会多几个字节的标识符,而这仅仅只是一种标准规定的,而且也没什么人遵守,除了微软。

看到另一篇博客讲得也挺有意思的。

如何批量修改文件的编码格式?

[23-11-10/23:01]

接上一篇,写batch不行,那就只能用别的方法了。
想要简单,首选还是python。

果不其然,啪的一下很快啊,就写完了:

# 打开原始文件进行读取
with open('original_file.txt', 'r', encoding="ANSI") as original_file:
    # 读取原始文件内容
    content = original_file.read()

# 打开新文件进行写入
with open('new_file.txt', 'w', encoding="UTF-8") as new_file:
    # 将原始文件内容写入新文件
    new_file.write(content)

print("文件复制完成")

但有两个问题。

第一个是,这只是复制文件,能不能直接改变编码后直接覆盖原文件。答案是可以,而且方法相当直接,把上面的代码的new_file.txt换成原来的original_file.txt就行了。

# 打开原始文件进行读取
with open('original_file.txt', 'r', encoding="ANSI") as original_file:
    # 读取原始文件内容
    content = original_file.read()

# 打开新文件进行写入
with open('original_file.txt', 'w', encoding="UTF-8") as new_file:
    # 直接把从原始文件读入的内容再写进去
    new_file.write(content)

print("文件转码完成")

第二个问题是,怎么批量进行这个操作。

想到了两个思路,第一个是让上面的脚本可以接收命令行参数,然后使用命令行脚本来循环执行python脚本;第二个思路是直接用python直接获取当前目录下的所有文件的文件名(像linux的ls那样),然后在循环中分别对每个文件进行操作。

感觉还是第二个简单一点,毕竟写Windows的batch还是太傻逼了点。

首先要找到列出文件的方法,很简单,这里上一个能列出所有以.txt后缀结尾的python脚本:

import os

# 获取当前文件夹路径
folder_path = os.getcwd()

# 列出当前文件夹下特定后缀的文件
target_extension = '.txt'  # 以.txt为例
matching_files = [file for file in os.listdir(folder_path) if file.endswith(target_extension)]

# 打印匹配的文件列表
for file in matching_files:
    print(file)

然后如果想要改变文件的编码,只需要把循环里的print换成上面的转码操作就行了。

不过如果文件夹下还有文件夹呢,能不能递归地进入文件夹中把所有文件夹下的所有文件路径都给找出来呢?于是就有了下面这个脚本:

import os

def list_files(start_path):
    for root, dirs, files in os.walk(start_path):
        for file in files:
            print(os.path.join(root, file))

# 调用函数并传入要遍历的文件夹路径
folder_path = os.getcwd()
list_files(folder_path)

于是这下同样只要把循环里的print改成转码操作就行了。

下面是最终实例:

import os

def trans_encoding(original_file, new_file, original_encoding, new_encoding):
	print("[开始转码文件]")
	print(f"\t{original_file} ({original_encoding})")
	print(f"--> \t{new_file} ({new_encoding}) ")
	# 打开原始文件进行读取
	with open(original_file, 'r', encoding=original_encoding) as of:
	    # 读取原始文件内容
	    content = of.read()

	# 打开新文件进行写入
	with open(new_file, 'w', encoding=new_encoding) as nf:
	    # 直接把从原始文件读入的内容再写进去
	    nf.write(content)

	print('[转码完成]')


def list_files_and_do_fun(start_path, target_extension):
	for root, dirs, files in os.walk(start_path):
		matching_files = [file for file in files if file.endswith(target_extension)]
		for matching_file in matching_files:
			complete_file_path = os.path.join(root, matching_file)
			trans_encoding(complete_file_path, complete_file_path, "ANSI", "UTF-8")


# 调用函数并传入要遍历的文件夹路径
folder_path = os.getcwd()
target_extension = '.txt'  # 以.txt为例
list_files_and_do_fun(folder_path, target_extension)

大功告成!

[后记23-11-11/0:23]
本来想把转码函数当高阶函数来用,记得之前搞过这种用法,但已经不太记得了,搞不出来,想搞还得再补补课,好晚了,先睡觉了。

posted @ 2023-11-10 15:56  码鸽  阅读(7)  评论(0编辑  收藏  举报