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

标签 python linux bash encoding utf-8

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

此脚本在我的机器上运行正常,但不能在另一台机器上运行。我尝试使用 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'
    öüóőúéáűíÖÜÓŐÚÉÁŰÍ
    

这里是调试的一些细节:

运行良好的机器是带有 bash=4.2-2ubuntu2.6Ubuntu Trusty,运行不佳的机器是 Ubuntu Precise使用 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
    

有关更多详细信息,您可以查看此文件:https://github.com/andras-tim/callrecord-renamer/blob/master/callrecord-renamer.py

更新2

我已经检查过:这个错误是由 bash 代码独立引起的。 .ini 文件编码错误...对不起所有调试器助手!

最佳答案

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

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

关于python - 如何修复 bash 中 UTF-8 字符串的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33286867/

相关文章:

c - Linux 中的每线程语言环境

regex - 如何从重定向中排除子域?

python - 在 Python 中运行 shell 内置命令

python - Seq2Seq 模型和损失函数(在 keras 中)

Linux/AM3352 : setting gpio via sysfs seem not working

bash - 如何递归删除所有文件的尾随空格?

bash - 捕获中断后如何使 Bash 的读取中止?

python - 使用for循环过滤范围之间数据框的列?

python - 来自独特 numpy 元素的 Pandas 数据框

python - SQL - 如何随机选择有序子集?