鱼壳的字符串拆分和外语

时间:2019-07-05 05:20:59

标签: string shell utf fish

关于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之间拆分?

1 个答案:

答案 0 :(得分:1)

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

对于string split '',fish将把输入转换为UTF-32(按代码点分割),并分别输出每个代码点,并转换为用户的语言环境。分解后的字符和其他字素簇可能会分裂。

Shell不太适合用于支持Unicode的文本处理。