如何用Elixir代码将文件从代码页936转UTF-8?已找到codepage字符串转换包
文件代码页转换解决方案(基于codepage包)
核心逻辑
文件转码的本质是「读取原编码字节→转译为Unicode→编码为目标字节→写入新文件」,借助codepage包可以完成完整的编码转换链路。
方案1:常规文件转码(Elixir)
适用于中小体积文件,一次性处理:
- 读取文件原始字节(避免默认编码解析干扰)
- 用codepage将字节解码为Unicode字符串
- 再编码为目标编码的字节流
- 写入新文件
示例代码:
defmodule FileConverter do def convert(input_file, output_file, from_code, to_code) do input_file |> File.read!() |> Codepage.from_string(from_code) |> Codepage.to_string(to_code) |> then(&File.write!(output_file, &1)) end end # 调用示例:将GBK编码文件转为UTF-8 FileConverter.convert("source_gbk.txt", "target_utf8.txt", :gbk, :utf8)
方案2:大文件流式转码
针对大文件(避免内存溢出),采用分块流式处理:
- 分块读取原始字节流
- 逐块完成转码后写入目标文件
- 注意:部分多字节编码可能存在字符跨块问题,可根据实际情况调整块大小或使用codepage的流式处理API
示例代码:
def convert_large_file(input_file, output_file, from_code, to_code) do input_stream = File.stream!(input_file, [], 4096) # 4KB分块 output_stream = File.stream!(output_file, [:binary], 4096) input_stream |> Stream.map(&Codepage.from_string(&1, from_code)) |> Stream.map(&Codepage.to_string(&1, to_code)) |> Stream.into(output_stream) |> Stream.run() end
关键注意点
- 必须确认原文件的准确编码,不确定时可使用编码检测工具辅助判断
- 提前查阅codepage包文档,确认目标编码是否被支持
- 转码后建议抽样验证文件内容,避免因编码兼容问题导致乱码或字符丢失
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

