java - Intellij IDEA : Impossible to commit files: 'utf8' codec can't decode byte 0xcc in position 9

标签 java intellij-idea mercurial bitbucket

IntelliJ IDEA 14.0.1

插件:jetbrains-bitbucket-connector

我正在尝试提交文件,但出现错误:

Error:transaction abort!

rollback completed abort:

decoding near 'C:\Users\����\AppDa': 'utf8' codec can't decode byte 0xcc in position 9: invalid continuation byte!

有人遇到过这个错误吗?如何解决?

谢谢。

最佳答案

这可能不是您正在寻找的答案,但可以让您了解可能发生的情况:

在大多数系统上,文件路径由字节组成,因为文件系统的设计比 Unicode 早几十年。 Unicode 通过将字节解释为 UTF-8 编码的字符串来改进它们。不幸的是,没有办法在文件名中说“这是 Cp-1251”和“这是 UTF-8”。因此,“将文件名转换为字符串”代码依赖于平台的默认编码。 NTFS 通过始终将文件名存储为 Unicode(忽略本地代码页)解决了这个问题,但是当您使用在屏幕上显示它们的工具时,这些名称将被转换为本地代码页。

然后是 Python 2,其中 Unicode 也以类似的方式进行了改进。 Python 的优势在于您拥有两种类型的对象(strunicode),因此理论上,您可以区分原始字节和 Unicode。当您从某处获得一堆字节并且逻辑上说“这应该是 Unicode”时,问题就开始了——当您从磁盘读取文件名时会发生这种情况。

在您的情况下,文件系统将包含 Cp1251 编码字符的字节传递给 Python,但 Python 代码尝试将它们读取为 UTF-8 编码的 Unicode。对于许多字符(< code point 128),这是可行的,但它会破坏代码点 > 128 的所有字符。\xCC 是这里的常见情况,因为 UTF-8 使用此字节对所有代码点进行编码介于 128 和 256 之间。这就是为什么您在欧洲经常看到此错误的原因 - 我们经常使用这些字符。

现在创建 Mercurial 的人都清楚这一切。大多数时候,Mercurial 应该可以正常工作。参见 https://www.mercurial-scm.org/pipermail/mercurial/2009-January/023762.html

据我所知,您的问题可能是由以下原因引起的:

  • Windows 以某种方式使用了本地代码页来创建您的主目录(不太可能)
  • Mercurial 获取 Unicode 路径,但出于某种原因,它认为该字符串是原始字节并尝试使用 UTF-8 解码器进行解码。由于解码应用了两次,因此失败。也许您使用的是旧版本的 Mercurial。尝试更新。
  • 也许您向我们展示了错误消息的错误部分,而问题实际上出在您尝试提交的文件中。在这种情况下,我们可以忽略错误消息中的奇数 � 字符。确保在编辑文件时使用正确的编码。

要查看它是哪一个,我建议创建一个文件夹 C:\dev 并在那里工作。如果这有效,那么你的主文件夹有问题或者 Mercurial 有错误。

关于java - Intellij IDEA : Impossible to commit files: 'utf8' codec can't decode byte 0xcc in position 9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27356306/

相关文章:

python - Mercurial:hgwebdir 的权限被拒绝

java - log4j 类配置器中没有方法 setRootLevel()

java - IntelliJ 实时模板 : modified setters template

intellij-idea - 为什么在 IntelliJ 中运行 TestCase 时 JUnit Jupiter 和 JUnit Vintage 分开了?

java - 文件突然没有出现在 Intellij Idea "Go to file..."中

python - IIS 7.5 上的 Mercurial 和 hgweb - python 错误

git - hg 相当于 git revert

Java菜单循环

java - GUI - 如何在保存用户输入的同时在面板或框架之间切换

java - 为什么添加5个对象后这个集合的大小是1?