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

时间:2015-10-22 17:20:19

标签: python linux bash encoding utf-8

我有一个 bash 脚本,其中包含多个 utf-8 字符串包含的变量。这些变量用作sctript中bash函数的参数,使用此参数调用cppython脚本。

此脚本在我的计算机上正常运行,但无法在另一台计算机上运行。我尝试使用set -x和其他内容进行调试,但我找不到根本原因,只是这种差异。

有一个最小化的例子 - 比如Plunker for JS;)

  1. 我有以下test.sh

    #!/bin/bash
    set -x
    
    function aaa() {
        echo "$1"
    }
    echo 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ'
    aaa 'öüóőúéáűíÖÜÓŐÚÉÁŰÍ'
    
  2. 我复制到我的两个主机

  3. 该商品显示以下内容:

    + echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    + aaa öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    + echo öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    
  4. 然而,坏消息表明了这一点:

    + 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'
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    
  5. 以下是调试的一些细节:

    好的工作机器是 Ubuntu Trusty bash=4.2-2ubuntu2.6,糟糕的工作机器是 Ubuntu Precise bash=4.3-7ubuntu1.5

    两台机器中的locale相同:

    $ 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
      

    有关详细信息,您可以在https://github.com/andras-tim/callrecord-renamer/blob/master/callrecord-renamer.py

    上查看此文件

    UPDATE2

    我已检查过:此错误是由 bash 代码独立引起的。 .ini 文件编码错误... 对所有调试器助手都很抱歉!

1 个答案:

答案 0 :(得分:2)

您正在比较set -x的xtrace调试输出。您不能也不应该期望bash的xtrace输出采用某种格式。如果你想要一种特定的格式,你需要自己制作。

如果查看脚本的非调试输出,它们在两台机器上都是相同的。