Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复bash中UTF-8字符串的使用?_Python_Linux_Bash_Encoding_Utf 8 - Fatal编程技术网

Python 如何修复bash中UTF-8字符串的使用?

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 'öüóőúéáűíÖÜ

我有一个bash脚本,它包含几个utf-8字符串包含的变量。这些变量用作sctript中bash函数的参数,即使用此参数调用
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:无效的开始字节
      
    有关详细信息,您可以在以下位置查看此文件:

    更新2
    我已检查:此错误独立于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
    中逃逸。-我在责备编码,因为现在,我已经在第三台机器上进行了检查(这也很精确),该脚本的工作地点。