Shell脚本如何转换文件编码格式

wen 实用脚本 6

本文目录导读:

Shell脚本如何转换文件编码格式

  1. 使用 iconv 命令 (最常用)
  2. 批量转换多个文件
  3. 递归转换目录下所有文件
  4. 自动检测编码并转换
  5. 使用 enca 工具(需要安装)
  6. 完整的Shell脚本模板
  7. 常用编码格式对照
  8. 使用示例
  9. 注意事项

在Shell脚本中转换文件编码格式,常用的方法有以下几种:

使用 iconv 命令 (最常用)

# 基本语法
iconv -f 原编码 -t 目标编码 输入文件 -o 输出文件
# 示例:将GBK编码转换为UTF-8
iconv -f gbk -t utf-8 input.txt -o output.txt
# 直接覆盖原文件
iconv -f gbk -t utf-8 input.txt > input.txt.tmp && mv input.txt.tmp input.txt

批量转换多个文件

#!/bin/bash
# 批量转换当前目录下所有.txt文件
for file in *.txt; do
    if [ -f "$file" ]; then
        iconv -f gbk -t utf-8 "$file" > "${file}.utf8"
        mv "${file}.utf8" "$file"
        echo "已转换: $file"
    fi
done

递归转换目录下所有文件

#!/bin/bash
# 递归转换目录下所有指定类型的文件
convert_encoding() {
    local dir="$1"
    local ext="$2"  # 文件扩展名
    find "$dir" -name "*.$ext" -type f | while read -r file; do
        echo "正在转换: $file"
        iconv -f gbk -t utf-8 "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
    done
}
# 使用示例:转换当前目录所有.java文件
convert_encoding "." "java"

自动检测编码并转换

#!/bin/bash
# 使用 file 命令检测编码
convert_with_auto_detect() {
    local file="$1"
    local encoding=$(file -bi "$file" | sed 's/.*charset=//')
    echo "检测到编码: $encoding"
    case "$encoding" in
        utf-8|us-ascii)
            echo "已经是UTF-8编码,跳过"
            ;;
        iso-8859-1|iso-8859-2|utf-16*)
            iconv -f "$encoding" -t utf-8 "$file" > "${file}.utf8" && mv "${file}.utf8" "$file"
            ;;
        *)
            echo "未知编码: $encoding,尝试转换为UTF-8"
            iconv -f "$encoding" -t utf-8 "$file" > "${file}.utf8" 2>/dev/null && mv "${file}.utf8" "$file" || echo "转换失败"
            ;;
    esac
}
convert_with_auto_detect "example.txt"

使用 enca 工具(需要安装)

# 安装 enca
# Ubuntu/Debian: sudo apt-get install enca
# CentOS/RHEL: sudo yum install enca
#!/bin/bash
# 自动检测并转换编码
for file in *.txt; do
    if [ -f "$file" ]; then
        # 检测编码
        ENCODING=$(enca -L zh "$file" 2>/dev/null)
        if [ "$ENCODING" != "UTF-8" ]; then
            # 转换为UTF-8
            enconv -L zh -x utf8 "$file"
            echo "已转换: $file (原编码: $ENCODING)"
        else
            echo "跳过: $file (已经是UTF-8)"
        fi
    fi
done

完整的Shell脚本模板

#!/bin/bash
# 文件编码转换脚本
# 用法: ./convert_encoding.sh [目录] [扩展名]
DEFAULT_DIR="."
DEFAULT_EXT="txt"
TARGET_ENCODING="utf-8"
# 参数处理
SEARCH_DIR="${1:-$DEFAULT_DIR}"
FILE_EXT="${2:-$DEFAULT_EXT}"
# 支持的源编码列表(按优先级)
SOURCE_ENCODINGS=(
    "gbk"
    "gb2312"
    "big5"
    "shift-jis"
    "euc-jp"
    "euc-kr"
    "iso-8859-1"
    "windows-1252"
)
echo "开始转换 $SEARCH_DIR 目录下的所有 .$FILE_EXT 文件"
echo "目标编码: $TARGET_ENCODING"
echo "-----------------------------------"
convert_file() {
    local file="$1"
    local retries=0
    local max_retries=${#SOURCE_ENCODINGS[@]}
    while [ $retries -lt $max_retries ]; do
        local encoding="${SOURCE_ENCODINGS[$retries]}"
        if iconv -f "$encoding" -t "$TARGET_ENCODING" "$file" > "${file}.tmp" 2>/dev/null; then
            if [ -s "${file}.tmp" ]; then  # 检查文件是否为空
                mv "${file}.tmp" "$file"
                echo "[成功] 使用 $encoding 编码转换: $file"
                return 0
            fi
        fi
        ((retries++))
    done
    echo "[失败] 无法转换: $file"
    rm -f "${file}.tmp"
    return 1
}
export -f convert_file
# 查找并转换文件
find "$SEARCH_DIR" -name "*.$FILE_EXT" -type f | while read -r file; do
    convert_file "$file"
done
echo "-----------------------------------"
echo "转换完成!"

常用编码格式对照

区域 常见编码
中文(简体) GBK, GB2312, GB18030
中文(繁体) Big5, Big5-HKSCS
日文 Shift_JIS, EUC-JP, ISO-2022-JP
韩文 EUC-KR
通用 UTF-8, UTF-16, ASCII

使用示例

# 1. 基本转换
iconv -f gbk -t utf-8 input.txt -o output.txt
# 2. 批量转换js文件
./convert_encoding.sh ./src js
# 3. 自动检测并转换
./convert_encoding.sh ./documents txt
# 4. 查看文件编码
file -i filename.txt

注意事项

  1. 备份文件:转换前建议先备份重要文件
  2. 兼容性:GBK包含GB2312,但GBK不能完全转换为GB2312
  3. 验证转换:转换后使用 file -i 检查编码
  4. 特殊字符:某些特殊字符可能导致转换失败
  5. 大文件处理:大文件转换可能较慢,考虑分批处理

这个脚本可以根据你的具体需求进行调整和扩展。

抱歉,评论功能暂时关闭!