歌词编码格式批量修改

  1. 学习日志:解决比亚迪宋 2017 款歌词乱码问题
    1. 初衷
    2. 发现问题的过程
    3. 代码调整与最终方案
    4. 成果

学习日志:解决比亚迪宋 2017 款歌词乱码问题

初衷

最近朋友提到,他有一辆比亚迪宋 2017 款的车,用 U 盘播放歌曲时,歌词文件(LRC 格式)在中控屏幕上总是显示乱码。这让我萌生了帮他解决这个问题的想法。初步猜测,可能是歌词文件的编码与中控系统不兼容,于是决定写一个 Python 脚本,批量将歌词文件转换为适合的编码。

发现问题的过程

一开始,我尝试将歌词文件从常见的 UTF-8 编码转为 GBK,因为国内很多老设备更倾向于支持 GBK。我用 iconv 命令测试单个文件,发现转换后仍乱码,怀疑中控可能有特殊要求。随后,我用 Python 写了一个脚本,利用 chardet 检测原始编码并转换,结果遇到了 UnicodeEncodeError,提示某些字符(如韩文 \uae40)无法转为 GBK。接着,我调整脚本用 errors="ignore" 跳过这些字符,但又遇到 UnicodeDecodeError,发现 chardet 检测的编码(如 GB2312)不准确。进一步测试后,我意识到需要更健壮的读取逻辑,同时支持多个文件夹批量处理。

代码调整与最终方案

通过查阅 Python 文档和编码相关资料,我不断优化脚本。以下是代码调整的关键过程:

  1. 解决编码错误:添加 errors="ignore" 和备用编码 GB18030。
    1
    2
    3
    4
    5
    6
    7
    8
    try:
    with open(file_path, "r", encoding=original_encoding) as f:
    content = f.read()
    except UnicodeDecodeError:
    with open(file_path, "r", encoding="gb18030") as f:
    content = f.read()
    with open(file_path, "w", encoding="gbk", errors="ignore") as f:
    f.write(content)
  2. 支持多文件夹:引入 folder_paths 列表,遍历 6 个文件夹。
    1
    2
    3
    4
    5
    folder_paths = ["/Users/yuanfei/Desktop/Lyrics1", ...]
    for folder_path in folder_paths:
    for filename in os.listdir(folder_path):
    if filename.endswith(".lrc"):
    # 转换逻辑

最终,我完成了以下脚本,成功将 6 个文件夹中的所有歌词转为 GBK 编码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# -*- coding: utf-8 -*-
import os
import chardet

folder_paths = ["/Users/yuanfei/Desktop/Lyrics1", "/Users/yuanfei/Desktop/Lyrics2", ...] # 6 个文件夹
target_encoding = "gbk"

for folder_path in folder_paths:
for filename in os.listdir(folder_path):
if filename.endswith(".lrc"):
file_path = os.path.join(folder_path, filename)
with open(file_path, "rb") as f:
result = chardet.detect(f.read())
original_encoding = result["encoding"]
try:
with open(file_path, "r", encoding=original_encoding) as f:
content = f.read()
except UnicodeDecodeError:
with open(file_path, "r", encoding="gb18030") as f:
content = f.read()
with open(file_path, "w", encoding=target_encoding, errors="ignore") as f:
f.write(content)
print(f"已转换: {filename}")

成果

经过多次尝试和调整,脚本成功运行,所有歌词文件转为 GBK 编码。朋友将 U 盘插入比亚迪宋的中控后,歌词终于正常显示,没有乱码。这次经历让我深入理解了编码转换的复杂性,也提升了 Python 文件处理的实战能力。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 756872006@qq.com

×

喜欢就点赞,疼爱就打赏

相册