【问题标题】:SVN Error: Can't convert string from native encoding to 'UTF-8'SVN 错误:无法将字符串从本机编码转换为“UTF-8”
【发布时间】:2011-01-08 04:07:50
【问题描述】:

我有一个提交后挂钩脚本,当提交到存储库时,它会执行工作副本的 SVN 更新。

当用户使用 TortoiseSVN 从他们的 Windows 机器提交到存储库时,他们会收到以下错误:

post-commit hook failed (exit code 1) with output:
svn: Error converting entry in directory '/home/websites/devel/website/guides/Images' to UTF-8
svn: Can't convert string from native encoding to 'UTF-8':
svn: Teneriffa-S?\195?\188d.jpg

上面有问题的文件是:Teneriffa-Süd.jpg 注意重音 u。这是因为该网站是德语,并且文件是用德语拼写的。

在 Linux 命令行上对工作副本执行更新时,不会遇到任何错误。上述错误仅在 Windows SVN 客户端通过提交执行 post-commit 挂钩时存在。

问题:

  1. 为什么 SVN 会尝试更改文件的编码?
  2. 是否允许文件名包含 Windows 标准 ASCII 字符之外的字符?

更新:

事实证明,从 Windows 机器(通过 Samba)查看时,相关文件的文件名正确显示为 Teneriffa-Süd.jpg,但是当我从文件所在的 Linux 服务器(使用 SSH 和 PuTTY)查看文件名时,我得到了Teneriffa-Süd.jpg

【问题讨论】:

  • 快速说明:Samba + Windows 和 SSH +PuTTY 之间的文件名差异可能是 PuTTY 配置的结果,而不是与您的问题有关。在 PuTTY 的窗口 Translation 下,“远程字符集”选项可能需要更改为 UTF-8。
  • 对我来说,问题在于我的提交消息中的非 ASCII 字符。

标签: linux svn version-control


【解决方案1】:
  1. 它将编码更改为与位置无关的编码,以防具有不同编码的人检查出来。

  2. 当然。但它不是“Windows”ASCII(Windows 实际上使用了一些奇怪的编码,比如 CP1251 左右)。

解决此问题的最佳方法是确保您的系统尽可能使用 UTF-8(检查 $LANG)。

【讨论】:

  • 在 Linux 中回显该系统变量并返回 en_GB.UTF-8,这意味着它正在使用 UTF-8
  • 我的意思是它应该在您的本地系统上回显,但如果您运行的是 Windows,则它不适用,所以没关系。
【解决方案2】:
  1. 它不会更改文件的编码。它改变了文件名的编码(希望每个客户都能理解)。
  2. 谁允许? NTFS 使用 16 位代码点,Windows 可以根据您的要求以各种编码公开文件名(它会尝试将它们转换为您要求的编码)。现在...那一点(您如何询问)取决于您使用的特定 svn 客户端。这听起来像是 TortoiseSVN 中的一个错误。

编辑添加:

呃。我误解了症状。 svn 服务器将所有内容都存储在 utf-8 中(而且它似乎成功地做到了)。

提交后挂钩是无法从 UTF-8 转换的位。如果我理解您的意思正确,服务器上的提交后挂钩会触发对共享驱动器的 svn 更新(因此,svn 服务器会为其自身启动一个 svn 客户端......)?这意味着需要修复的配置是客户端服务器上的配置。 在执行 svn 服务器的环境中检查 LANG / LC_ALL。。碰巧的是,这些钩子在vacuum environment 中运行(请参阅提示)。所以你应该在钩子本身中设置变量。

另请参阅this page 了解有关 svn 如何处理本地化的信息

【讨论】:

  • 文件名 Teneriffa-Süd.jpg 正确显示在我的 Windows 机器上的工作副本中,以及驻留在 Linux 服务器上的提交后挂钩尝试更新的工作副本(相同当在 Windows 中使用 samba 共享查看该文件夹时。但是当我在 Linux 命令行的文件夹中执行 ls 时,我得到:Teneriffa-Süd.jpg
  • 这可能只是意味着文件名包含直接 UTF-8 编码的数据(这并不奇怪,因为转换失败),并且 windows 解析得很好,而你的 linux 机器没有配置为看到 UTF- 8 个文件名,因此它可以将其读取为它想要的任何代码页。
  • 是的,您是正确的,因为 SVN 客户端在服务器本身的客户端中失败。我会查看您发送给我的链接并回复您。
  • +1 表示钩子是在真空环境中运行的,然后 export LANG=xxxxx 就可以了
【解决方案3】:

不要忘记在您的系统中生成这些语言环境
(作为根)

Ru的例子

locale-gen ru_RU.CP1251
locale-gen ru_RU.UTF-8
dpkg-reconfigure locales

【讨论】:

  • 您至少应该提及这些命令适用于什么系统,它们不是标准命令。
【解决方案4】:

把它放在你的提交后 export LANG=xxxxx(你的语言)

【讨论】:

  • 一行,问题就解决了。我在没有导出的情况下尝试了 LANG 半小时。 :-( 你需要安装你的语言环境doing this
【解决方案5】:

如果错误是 -

[abc@288832-web3 public_html]$ svn update
svn: Error converting entry in directory 'images' to UTF-8
svn: Valid UTF-8 data
(hex: 46 65 6e 65 72 62 61 68)
followed by invalid UTF-8 sequence
(hex: e7 65 2b 46)

然后执行此操作。

[abc@288832-web3 public_html]$ printf "\x46\x65\x6e\x65\x72\x62\x61\x68\n"
Fenerbah  

(这意味着系统在该文件夹中有一些以“Fenerbah”开头的文件名。)

[abc@288832-web3 public_html]$ cd  images
[abc@288832-web3 images]$ rm -rf Fenerbahçe+Forma+2.jpg

所以你可以看到名字中有一个特殊字符,SVN不支持。

【讨论】:

【解决方案6】:

又一个例子:

$ svn update
svn: Error converting entry in directory '.' to UTF-8
svn: Can't convert string from native encoding to 'UTF-8':

$ export LC_CTYPE=en_US.UTF-8

$ svn update

(......现在一切都很好)

【讨论】:

  • 我将导出语句添加到我的预提交文件的顶部并且它可以工作。 export LC_CTYPE=en_US.UTF-8
  • 巴西葡萄牙语示例(cedilla、a 尖等):export LC_CTYPE=pt_BR.UTF-8
  • 来自西班牙的西班牙语,使用:export LC_CTYPE=es_ES.UTF-8
  • 我还必须取消设置LC_ALL,或者将其设置为en_US.UTF-8
【解决方案7】:

我在目录上运行“svn add”时遇到了类似的问题,但解决方案不同。我无法使用 printf 看到“十六进制”数字(实际上 svn 没有显示十六进制输出),但是这个命令让我可以看到结果并修复它:

LC_ALL=C svn add probealign

我认为,一般来说,在你的命令之前粘贴 LC_ALL=C 可以让你看到有问题的文件......并且比粘贴很多 \x72 东西(显然可能不可用)要容易得多。

【讨论】:

    【解决方案8】:

    在执行任何 svn 命令之前,只需在脚本中使用以下行。 用户适当的语言代码,在以下示例中我使用了日语

    export LC_ALL=ja_JP.UTF8
    

    【讨论】:

      【解决方案9】:

      似乎所有 LC_ 变量最后都需要 .UTF8。例如,我碰巧定义了 LC_ALL、LC_TIME 和 LC_CTYPE。设置 LC_CTYPE 后问题没有解决,所以我还需要输入 LC_ALL 才行:

      LC_ALL=en_US.UTF-8
      LC_TIME=en_DK.UTF-8
      LC_CTYPE=en_US.UTF-8
      

      为了避免再次出现问题,我将文件复制到另一个名称,从 svn 中删除旧的,在 svn 中添加新的,并发送消息给协作者不要这样做。

      【讨论】:

        【解决方案10】:

        有关信息,我在提交 native encoding to 'UTF-8' 时遇到此错误,使用 Windows 客户端 tortoise svn,

        当我的存储库 URL 是:

        http://x.x.x.x/svn/myrepos

        我将存储库的 URL 更改为:

        svn://x.x.x.x/myrepos

        现在一切都完美了。

        我认为这些信息会对某些人有用。

        【讨论】:

          【解决方案11】:

          就我而言,我在 ~/.subversion/config 中有如下设置 log-encoding = ...

          评论成功了。

          【讨论】:

            猜你喜欢
            • 2012-08-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-08
            • 2011-05-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多