fish shell 的字符串拆分和外语

fish shell's string split and foreign languages

关于 fish 的内置 string 函数的快速问题,特别是 string split。它的实现是否考虑任何大小的 UTF?而且,如果是,它的实现是否知道如何处理 UTF-32?

例如,我编写了一个简单的函数,它从 stdin 读取并将字符串分解为数组。

function traverse
  set --local text (string split '' (read))
  echo $text
end

traverse

然后我在脚本中调用这个函数。我使用了命令echo "test" | fish traverse.fish,输出t e s t,所以很好。

echo "test 漢字" | fish traverse.fish 输出 t e s t 漢 字,这样就可以了。

下一个案例很特别。

echo "test 漢字 الْحُرُوف الْعَرَبِيَّة" | fish traverse.fish 输出 t e s t 漢 字 ا ل ْ ح ُ ر ُ و ف ا ل ْ ع َ ر َ ب ِ ي َ ّ ة。现在,我不懂阿拉伯语,但这是正确的吗?似乎阿拉伯字符可能是 UTF-32,并且各种连词可以与更简单的字符一起出现,但这只是一个猜测。我的直觉告诉我们阿拉伯语不应该这样拆分。

我认为了解 string split 关于 UTF 的详细信息会有所帮助,假设这确实是某种错误。

编辑:表达我的问题的更好方式是:fish 的 string split 函数是否在 UTF 定义的所有字素之间拆分,或者只是 UFT-8/UTF-16?

string splitwchar_t 的序列进行运算。在 Unix/Linux 的典型用法中,输入通过用户的语言环境(使用 mbrtowc)转换为 UTF-32,并通过文字代码点搜索进行拆分。

string split ''的情况下,fish会将输入转换为UTF-32,按代码点拆分,并分别输出每个代码点,转换为用户的语言环境。分解的字符和其他字形簇可能会被拆分。

Shell 不太适合 Unicode-savvy 文本处理。