val*_*tev 4 python django macos ssh locale
我的 Django 应用程序在启动时(或当我执行管理命令时)加载一些文件。当我从一台 Arch 或 Ubuntu 机器上进行 ssh 工作一切正常时,我能够成功运行任何命令和迁移。
但是当我从 OS X(我有 El Capital)进行 ssh 并尝试执行相同的操作时,我收到此错误:
UnicodeDecodeError: 'ASCII' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
要打开我的文件,我使用with open(path_to_file) as f: ...
从 iterm 和终端进行 sshing 时会发生该错误。我发现原因是LC_CTYPE环境变量。它没有在我的其他 Linux 机器上设置,但在 mac 上是UTF-8这样的,所以在我 ssh 到服务器后,它被设置为相同的。我取消设置后错误已修复LC_CTYPE。
所以真正的问题是发生了什么以及如何进一步避免这种情况?我可以在本地计算机中取消设置此变量,但这会产生一些负面影响吗?最好的方法是什么?
您本地计算机上的终端使用字符编码。它使用的编码似乎是 UTF-8。当您登录到服务器时(顺便说一句,它运行什么操作系统?),在那里运行的程序需要知道您的终端支持什么编码,以便它们根据需要显示内容。他们从 获得此信息LC_CTYPE。ssh正确地将其设置为 UTF-8,因为这是您的终端支持的。
当您取消设置 时LC_CTYPE,您的程序将使用默认值ASCII。程序现在显示为,ASCII而不是UTF-8,它可以工作,因为UTF-8它向后兼容ASCII。但是,如果程序需要显示 中不存在的特殊字符ASCII,则它将无法工作。
尽管从您提供的信息来看,我并不完全清楚为什么系统会以这种方式运行,但我可以告诉您取消设置LC_CTYPE是一个不好的解决方法。为了避免将来出现问题,最好确保所有机器上的所有终端都使用 UTF-8,并摆脱 ASCII。
当您尝试访问open文件时,Python 使用终端的(即LC_CTYPE)字符集。我一直不太明白为什么会这样;为什么终端的字符集应该指示文件的编码?然而,这就是它的制作方式,正确解决问题的方法是使用参数(encoding如果open您使用的是 Python 3)或codecs标准库模块(如果您使用的是 Python 2)。
| 归档时间: |
|
| 查看次数: |
1371 次 |
| 最近记录: |