我正在研究一个键盘映射脚本(将键从一种语言键盘布局映射到另一种键盘布局)。在努力让一切正常运行之后,我发现不同的字符在所有程序(perl、python)中的处理方式都不同。然后我在终端(kitty、gnome-terminal — 没关系)中运行一个简单的测试脚本(现在已简化):
python -c 'import sys;print(len(sys.argv[1]))' テスト
并得到了预期的结果:
3
但是如果我在 sh/bash (unix&utf-8) 文件中运行它:
#!/usr/bin/env bash
# or
#!/bin/sh
python -c 'import sys;print(len(sys.argv[1]))' テスト
我得到(./test.sh
):
9
这就是所有这些编码/解码/升级/降级 UTF-8 的东西在 Perl 中不起作用的原因(如果我从终端手动运行命令,它可能会在没有所有这些额外的编码功能的情况下工作)。
现在我有一个问题:为什么完全相同的命令会根据执行环境(终端仿真器与 shell 脚本)给出不同的结果?我怎样才能解决这个问题?
更新:
我忘了我的:
alias python='python3'
因此,对于 Python,python3
显式运行可以使两种情况下的一切都一样。但另一方面,对于 Perl:
echo 'print length $ARGV[0];' | perl -l -- - テスト
这工作相同,但在这两种情况下它输出9
。对于 Perl,没有不同的版本,我的版本是 5.30.0(在两种情况下打印的完全相同)。我是否必须在 Perl 本身中添加一些代码以使其像 Python3 一样工作(1 个 Unicode 字符的长度是 1 而不是 1-3 个字节)?
这不是关于 shell,而是关于
python
. 我可以通过使用 python3 然后使用 python2 显式运行相同的命令来重现它:由于您没有使用特定
python
可执行文件的完整路径,因此您的终端和脚本都将只使用python
它们在PATH
. 在您的情况下,PATH
您的非交互式 shell(运行脚本的那个)与PATH
您的交互式 shell(在终端)中的不同,而在前者中,python
显然指向 Python2 可执行文件。我不知道你为什么有这个,我需要更多地了解你的设置和你使用的操作系统,但是一个简单的解决方案,假设你在一个提供这个的系统上,
python3
而是调用脚本的python
:或者,使用完整路径(请参阅
type -a python
):这样您的结果将始终保持一致。