【问题标题】:How to solve UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte如何解决 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
【发布时间】:2021-07-25 14:07:28
【问题描述】:

我正在尝试使用 Black 来格式化我的 Django 代码。它在大多数目录中都可以正常工作。但是,我收到 Unicode 解码错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte on the .py files in a directory 特别是。这些文件采用 UTF-8 格式,但我尝试了多种不同的其他编码,并尝试删除和重新创建未解决问题的文件。我在 Anaconda 环境中工作,但停用它并没有任何区别。我还禁用了大部分 VS Code 扩展。

我已经查看了很多关于此的 SO 帖子,但迄今为止没有任何建议有帮助。我在 Mac 上使用 VS Code,感觉这与过去我在 Windows 机器上使用 VS Code 和 WSL(与 GitHub 存储库同步的代码)编辑相同代码的事实有关,但是无法弄清楚如何解决它。我在下面放了一个示例 Traceback 调用。任何帮助将不胜感激!

编辑:如果我将任何文件剪切并粘贴到另一个目录中,那么 Black 可以正常工作,并且我不会收到任何编码错误消息。这表明可能存在目录级别的问题?

(base) ➜  healthtic git:(master) ✗ black pages/views.py
Traceback (most recent call last):
  File "/Users/jh/opt/anaconda3/bin/black", line 8, in <module>
    sys.exit(patched_main())
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/black/__init__.py", line 1130, in patched_main
    main()
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/click/decorators.py", line 21, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/black/__init__.py", line 411, in main
    sources = get_sources(
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/black/__init__.py", line 477, in get_sources
    gitignore = get_gitignore(root)
  File "/Users/jh/opt/anaconda3/lib/python3.8/site-packages/black/files.py", line 123, in get_gitignore
    lines = gf.readlines()
  File "/Users/jh/opt/anaconda3/lib/python3.8/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

进一步编辑:如上所述,如果我将文件移出此目录,Black 工作正常,如果我将它们移回(不做任何更改),0xFF unicode 错误会再次出现。我在下面附上了我的目录结构,因为我在其中有一些前端的 webpack 和节点模块可能是相关的。我的印象是,目录中可能会以某种方式添加 BOM?

├── Dockerfile
├── accounts
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── appointments
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── cloud_sql_proxy
├── cloudmigrate.yaml
├── config
│   ├── __init__.py
│   ├── __pycache__
│   ├── asgi.py
│   ├── basesettings.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── docker-compose.yaml
├── front-end
│   ├── App\ copy.js
│   ├── App.js
│   ├── index\ copy.js
│   └── index.js
├── logfile
├── manage.py
├── node_modules
│   ├── @babel
│   ├── @discoveryjs
│   ├── @types
│   ├── @webassemblyjs
│   ├── @webpack-cli
│   ├── @xtuc
│   ├── acorn
│   ├── ajv
│   ├── ajv-keywords
│   ├── ansi-styles
│   ├── babel-loader
│   ├── babel-plugin-dynamic-import-node
│   ├── babel-plugin-polyfill-corejs2
│   ├── babel-plugin-polyfill-corejs3
│   ├── babel-plugin-polyfill-regenerator
│   ├── big.js
│   ├── browserslist
│   ├── buffer-from
│   ├── call-bind
│   ├── caniuse-lite
│   ├── chalk
│   ├── chrome-trace-event
│   ├── clone-deep
│   ├── color-convert
│   ├── color-name
│   ├── colorette
│   ├── commander
│   ├── commondir
│   ├── convert-source-map
│   ├── core-js-compat
│   ├── cross-spawn
│   ├── debug
│   ├── define-properties
│   ├── electron-to-chromium
│   ├── emojis-list
│   ├── enhanced-resolve
│   ├── envinfo
│   ├── es-module-lexer
│   ├── escalade
│   ├── escape-string-regexp
│   ├── eslint-scope
│   ├── esrecurse
│   ├── estraverse
│   ├── esutils
│   ├── events
│   ├── execa
│   ├── fast-deep-equal
│   ├── fast-json-stable-stringify
│   ├── fastest-levenshtein
│   ├── find-cache-dir
│   ├── find-up
│   ├── function-bind
│   ├── gensync
│   ├── get-intrinsic
│   ├── get-stream
│   ├── glob-to-regexp
│   ├── globals
│   ├── graceful-fs
│   ├── has
│   ├── has-flag
│   ├── has-symbols
│   ├── human-signals
│   ├── import-local
│   ├── interpret
│   ├── is-core-module
│   ├── is-plain-object
│   ├── is-stream
│   ├── isexe
│   ├── isobject
│   ├── jest-worker
│   ├── js-tokens
│   ├── jsesc
│   ├── json-parse-better-errors
│   ├── json-schema-traverse
│   ├── json5
│   ├── kind-of
│   ├── loader-runner
│   ├── loader-utils
│   ├── locate-path
│   ├── lodash
│   ├── lodash.debounce
│   ├── loose-envify
│   ├── make-dir
│   ├── merge-stream
│   ├── mime-db
│   ├── mime-types
│   ├── mimic-fn
│   ├── minimist
│   ├── ms
│   ├── neo-async
│   ├── node-releases
│   ├── npm-run-path
│   ├── object-assign
│   ├── object-keys
│   ├── object.assign
│   ├── onetime
│   ├── p-limit
│   ├── p-locate
│   ├── p-try
│   ├── path-exists
│   ├── path-key
│   ├── path-parse
│   ├── pkg-dir
│   ├── punycode
│   ├── randombytes
│   ├── react
│   ├── react-dom
│   ├── rechoir
│   ├── regenerate
│   ├── regenerate-unicode-properties
│   ├── regenerator-runtime
│   ├── regenerator-transform
│   ├── regexpu-core
│   ├── regjsgen
│   ├── regjsparser
│   ├── resolve
│   ├── resolve-cwd
│   ├── resolve-from
│   ├── safe-buffer
│   ├── scheduler
│   ├── schema-utils
│   ├── semver
│   ├── serialize-javascript
│   ├── shallow-clone
│   ├── shebang-command
│   ├── shebang-regex
│   ├── signal-exit
│   ├── source-list-map
│   ├── source-map
│   ├── source-map-support
│   ├── strip-final-newline
│   ├── supports-color
│   ├── tapable
│   ├── terser
│   ├── terser-webpack-plugin
│   ├── to-fast-properties
│   ├── unicode-canonical-property-names-ecmascript
│   ├── unicode-match-property-ecmascript
│   ├── unicode-match-property-value-ecmascript
│   ├── unicode-property-aliases-ecmascript
│   ├── uri-js
│   ├── v8-compile-cache
│   ├── watchpack
│   ├── webpack
│   ├── webpack-cli
│   ├── webpack-merge
│   ├── webpack-sources
│   ├── which
│   ├── wildcard
│   └── yocto-queue
├── notes.md
├── package-lock.json
├── package.json
├── pages
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── patient
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── patientinfo
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── readme.md
├── requirements.txt
├── static
│   ├── css
│   ├── images
│   ├── index-bundle.js
│   ├── index-bundle.js.LICENSE.txt
│   └── js-bundle.js
├── staticfiles
│   ├── admin
│   ├── css
│   └── images
├── templates
│   ├── _base.html
│   ├── account
│   ├── appointments
│   ├── frontend.html
│   ├── hello_webpack.html
│   ├── home.html
│   ├── patient
│   └── patientinfo
├── todos.md
└── webpack.config.js

【问题讨论】:

  • 看起来 pages/views.py 没有编码为 utf-8。位置 0 中的 0xff 表明它已使用 utf-16 编码(utf-16 有时在 Windows 上用作“unicode”编码)。
  • 感谢 Snakecharmer。我想我最好在回复之前三重检查。在 VS Code 的底部,它告诉我它是 utf-8(我猜过去可能是 utf-16)。我也刚刚检查了chardet,它告诉我它是ascii。但是,我检查了 Black 正在工作的其他文件,他们也说 UTF-8 和 chardet 也说他们是 ascii。
  • ff 是 UTF-8 编码中的非法字节,所以它肯定是 not UTF-8,但 ff 因为第一个字节是常见的 UTF- 16(小端字节序标记)。如果没有转储文件的第一个字节,我们将无能为力。尝试open(file,'rb').read(20) 并发布读取的字节数。
  • 除了Mark之外,如果位置0有一个字节ff,没有工具会告诉你文件是UTF-8。检查您是否使用相同的来源。注意:git chackout 所得到的并不意味着它在其他机器上具有相同的编码(在不同环境中工作时通常会发生转码和行尾约定更改,其中之一包括 Windows 或旧版代码)。
  • 感谢马克和贾科莫。我在上面做了进一步的编辑。 urls.py 文件的第一个字节(例如)是 b'from django.urls imp'(如果我把它移出目录也是一样的)。我无法解释仅在此目录中发生的行为。如果我将文件移出,则没有错误,如果我将相同的文件原封不动地放回目录中,则会再次出现错误。我曾认为 0xFF 与 BOM 相关(尽管 VS Code 告诉我它只是 utf-8,而不是 utf-8-bom)。感谢您考虑这一点。

标签: python django utf-8 character-encoding


【解决方案1】:

我什至不知道 django 是什么,但我在非 django 程序中遇到了同样的问题。 在那个代码片段中是现在已修复的问题:

open(document.txt, mode= "r", encoding="utf8")

如您所见,它的编码是 utf8,没有“-”。我使用该代码打开文档并阅读它。希望对你有用!

【讨论】:

  • 如果您查看编解码器文档,您会发现utf8 和utf-8 是相同编码的同义词。
  • 非常感谢,多普勒。恐怕这在我的场景中行不通。
  • 你怎么不知道Django是什么???
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2020-03-12
  • 2022-09-26
  • 2020-12-26
  • 2020-01-31
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多