Python 如何修复bash中UTF-8字符串的使用?
我有一个bash脚本,它包含几个utf-8字符串包含的变量。这些变量用作sctript中bash函数的参数,即使用此参数调用Python 如何修复bash中UTF-8字符串的使用?,python,linux,bash,encoding,utf-8,Python,Linux,Bash,Encoding,Utf 8,我有一个bash脚本,它包含几个utf-8字符串包含的变量。这些变量用作sctript中bash函数的参数,即使用此参数调用cp和python脚本 此脚本在我的计算机上正常运行,但无法在另一台计算机上运行。我尝试使用set-x和其他东西进行调试,但找不到根本原因,只有这一差异 这里有一个简化的示例,如Plunker for JS;) 我有以下test.sh #!/bin/bash set -x function aaa() { echo "$1" } echo 'öüóőúéáűíÖÜ
cp
和python
脚本
此脚本在我的计算机上正常运行,但无法在另一台计算机上运行。我尝试使用set-x
和其他东西进行调试,但找不到根本原因,只有这一差异
这里有一个简化的示例,如Plunker for JS;)
test.sh
#!/bin/bash
set -x
function aaa() {
echo "$1"
}
echo 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ'
aaa 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ'
+ echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ
öüóőúéáűíÖÜÓŐÚÉÁŰÍ
+ aaa öüóőúéáűíÖÜÓŐÚÉÁŰÍ
+ echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ
öüóőúéáűíÖÜÓŐÚÉÁŰÍ
+ echo $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215'
öüóőúéáűíÖÜÓŐÚÉÁŰÍ
+ aaa $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215'
+ echo $'\303\266\303\274\303\263\305\221\303\272\303\251\303\241\305\261\303\255\303\226\303\234\303\223\305\220\303\232\303\211\303\201\305\260\303\215'
öüóőúéáűíÖÜÓŐÚÉÁŰÍ
以下是调试的一些详细信息: 好的工作机器是一台可靠的Ubuntu,带有
bash=4.2-2ubuntu2.6
,坏的工作机器是一台精确的Ubuntu,带有bash=4.3-7ubuntu1.5
两台计算机中的区域设置
相同:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_MESSAGES=POSIX
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
更新
- 对不起,
我错了cp
- 我认为,python异常在本例中不相关,因为它在bash中被破坏。这个回溯有什么帮助吗
+ /tmp/callrecord-renamer.py --skip --contacts $'/var/datastore/T\303\274nci/Rendszer/DropboxClone/contacts.ini' $'/var/datastore/T\303\274nci/DropboxClone/H\303\215V\303\201SFELV\303\211TELEK' Traceback (most recent call last): File "/tmp/callrecord-renamer.py", line 316, in <module> main() File "/tmp/callrecord-renamer.py", line 312, in main FileManager(args.recording_path, contacts_path, args.no_change, args.skip_errors).update_files_in_directory() File "/tmp/callrecord-renamer.py", line 87, in update_files_in_directory self.contacts.load() File "/tmp/callrecord-renamer.py", line 56, in load self.database.read(self.file_path) File "/usr/lib/python3.2/configparser.py", line 689, in read self._read(fp, filename) File "/usr/lib/python3.2/configparser.py", line 994, in _read for lineno, line in enumerate(fp, start=1): File "/usr/lib/python3.2/codecs.py", line 300, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 3176: invalid start byte
+/tmp/callrecord-rename.py--skip--contacts$'/var/datastore/T\303\274nci/Rendszer/DropboxClone/contacts.ini'$'/var/datastore/T\303\274nci/DropboxClone/H\303\215V\303\201SFELV\303\211TELEK' 回溯(最近一次呼叫最后一次): 文件“/tmp/callrecord renamer.py”,第316行,在 main() 文件“/tmp/callrecord renamer.py”,第312行,主目录 文件管理器(args.recording\u path、contacts\u path、args.no\u change、args.skip\u errors)。更新\u目录()中的\u文件 文件“/tmp/callrecord renamer.py”,第87行,在\u目录的更新\u文件\u中 self.contacts.load() 文件“/tmp/callrecord renamer.py”,第56行,已加载 self.database.read(self.file\u路径) 文件“/usr/lib/python3.2/configparser.py”,第689行,已读 自读(fp,文件名) 文件“/usr/lib/python3.2/configparser.py”,第994行,已读 对于行号,枚举中的行(fp,开始=1): 文件“/usr/lib/python3.2/codecs.py”,第300行,解码 (结果,消耗)=自身缓冲区解码(数据,自身错误,最终) UnicodeDecodeError:“utf-8”编解码器无法解码位置3176中的字节0xfc:无效的开始字节
我已检查:此错误独立于bash代码引起。.ini文件编码错误。。。为所有调试器帮助程序感到抱歉 您正在比较
set-x
的xtrace调试输出。您不能也不应该期望bash的xtrace输出采用某种格式。如果你想要一个特定的格式,你需要自己制作
如果查看脚本的非调试输出,两台机器上的结果是相同的。我不确定您是否真的有问题。两种情况下的输出都是正确的;您只是在“坏”主机上的调试输出中得到了一个不同的(但有效)表示形式。我找到了这篇文章-但无法解决我的问题…:(@chepner
cp
找不到源路径,但这是存在的。如果您在cp
方面有问题,请向我们说明cp
的问题,而不是完全的其他问题。这似乎不是外壳问题,而是坏主机上的cp
在处理UTF-8编码字符串时的问题。t坏主机只是显示原始UTF-8流,而不是显示编码的Unicode字符。两台机器上的数据相同(\303\266
,例如,是八进制的。两个字节是0xC3和0xB6,这是U+00F6的UTF-8编码,呃。几年前我在调试bash代码,但直到现在我还看不到它从集合-x
中逃逸。-我在责备编码,因为现在,我已经在第三台机器上进行了检查(这也很精确),该脚本的工作地点。