lrc歌词文件转换编码为UTF-8 #68

Closed
opened 2023-03-24 02:22:24 +00:00 by lm93129 · 2 comments

从QQ音乐下载的音乐,附带的歌词,编码不是UTF8的,希望能在转换歌曲的时候,顺便监控歌词为UTF8

从QQ音乐下载的音乐,附带的歌词,编码不是UTF8的,希望能在转换歌曲的时候,顺便监控歌词为UTF8
Owner
  • 有些韩语歌词文件是 UTF-8 的。
  • 有些主要语言不是韩文的歌词但是混杂了部分韩文(如:美丽的神话)的 lrc 文件是错的,且编码为 GBK:
[01:14.49]女: 
[01:14.94]01 44 45 
[ 1: 9.7

[01:14.49]女:
[01:14.94]이제 나의 손을 잡고 눈을 감아요

建议使用其它工具获取歌词文件。

- 有些韩语歌词文件是 UTF-8 的。 - 有些主要语言不是韩文的歌词但是混杂了部分韩文(如:美丽的神话)的 lrc 文件是错的,且编码为 GBK: ```toml [01:14.49]女: [01:14.94]01 44 45 
[ 1: 9.7 [01:14.49]女: [01:14.94]이제 나의 손을 잡고 눈을 감아요 ``` 建议使用其它工具获取歌词文件。
jixunmoe added the
wontfix
label 2023-05-07 02:16:16 +00:00
Owner

因为编码转换不是该项目的目标,因此标记为 wontfix 并关闭。

如果需要批量转换,建议调用第三方程序进行检测/转换,或查找相应字符串。


下面是一段 bash 脚本,利用第三方工具(iconv/uchardet/dos2unix)来进行编码探测、转换。

fix_lyrics() {
  dos2unix | sed -E 's/:/: /g; s/\[([0-9]{2}:[0-9]{2}\.[0-9]{2})[0-9]+\]/[\1]/'
}

read_to_utf8() {
  local src_path="$1"
  local charset="$2"
  local encoded=""

  if [[ "$charset" = "UTF-8" ]]; then
    fix_lyrics <"$1"
  elif encoded="$(iconv -f "$charset" -t UTF-8 <"$1")"; then
    echo -n "${encoded}" | fix_lyrics
  else
    return 1
  fi
}

fix_encoding() {
  local charset
  if grep -qF $'\xA3\xBA' "$1"; then
    # 中文编码的 “:” 符号,QQ 音乐喜欢插入这个。
    charset="GB18030"
  else
    charset="$(uchardet "$1")"
  fi

  read_to_utf8 "$1" "${charset}"
}

用例:

fixed_lrc="$(fix_encoding "x.lrc")"
echo -n "$fixed_lrc" > x.lrc
因为编码转换不是该项目的目标,因此标记为 wontfix 并关闭。 如果需要批量转换,建议调用第三方程序进行检测/转换,或查找相应字符串。 --- 下面是一段 bash 脚本,利用第三方工具(`iconv`/`uchardet`/`dos2unix`)来进行编码探测、转换。 ```bash fix_lyrics() { dos2unix | sed -E 's/:/: /g; s/\[([0-9]{2}:[0-9]{2}\.[0-9]{2})[0-9]+\]/[\1]/' } read_to_utf8() { local src_path="$1" local charset="$2" local encoded="" if [[ "$charset" = "UTF-8" ]]; then fix_lyrics <"$1" elif encoded="$(iconv -f "$charset" -t UTF-8 <"$1")"; then echo -n "${encoded}" | fix_lyrics else return 1 fi } fix_encoding() { local charset if grep -qF $'\xA3\xBA' "$1"; then # 中文编码的 “:” 符号,QQ 音乐喜欢插入这个。 charset="GB18030" else charset="$(uchardet "$1")" fi read_to_utf8 "$1" "${charset}" } ``` 用例: ```bash fixed_lrc="$(fix_encoding "x.lrc")" echo -n "$fixed_lrc" > x.lrc ```
Sign in to join this conversation.
No description provided.