【发布时间】: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