web服务器 技术随笔

svn: 目录中的条目从本地编码转换到 UTF8 失败 解决办法

问题现象

在 Linux 下执行 svn update 时出现乱码,并伴随如下报错:

svn: 目录 XXXX 中的条目从本地编码转换到 UTF-8 失败
svn: 不能把字符串从本地编码转换为“UTF-8”编码
# 英文环境
update Error converting entry in directory to UTF-8

产生原因

SVN 要求仓库路径与工作副本中的文件名都使用 UTF-8 编码。当工作副本里存在 GBK / GB2312 编码的中文文件名(多见于 Windows 提交的目录),而 Linux 系统当前 locale 是 UTF-8 时,SVN 在转换这些文件名到 UTF-8 时就会失败。

解决办法一:临时切换当前会话编码

不必改动系统全局 LANG,只改当前用户环境变量即可:

export LANG="zh_CN.GB2312"

也可写入 ~/.i18n 使其持久化:

export LANG="zh_CN.GB2312"

然后删除报错的目录,重新 svn update。注意:这种方式把编码从 UTF-8 改成 GB2312,若之后再提交 UTF-8 文件名又会出问题,属于临时规避方案。

解决办法二:设置系统区域为 GB18030

编辑 /etc/sysconfig/i18n(RHEL/CentOS 6 及更早版本),改成:

LANG="zh_CN.GB18030"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"

保存后重启。各字段含义:

  • LANG:当前系统语言环境变量。
  • SUPPORTED:系统预置的语言支持范围,不在其中的语言无法正常显示。
  • SYSFONT:文本控制台登录时的字体。

RHEL5 中对应的 locale 目录为 /usr/lib/locale/zh_CN.gb18030。

根本建议

临时改 locale 只是绕开问题。更规范的做法是统一文件名编码:在 Windows 提交前把含中文的目录/文件名转成 UTF-8,或从仓库中移除非 UTF-8 文件,避免反复切换编码。

标签
svnLinux