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 split
对 wchar_t
的序列进行运算。在 Unix/Linux 的典型用法中,输入通过用户的语言环境(使用 mbrtowc
)转换为 UTF-32,并通过文字代码点搜索进行拆分。
在string split ''
的情况下,fish会将输入转换为UTF-32,按代码点拆分,并分别输出每个代码点,转换为用户的语言环境。分解的字符和其他字形簇可能会被拆分。
Shell 不太适合 Unicode-savvy 文本处理。
关于 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 split
对 wchar_t
的序列进行运算。在 Unix/Linux 的典型用法中,输入通过用户的语言环境(使用 mbrtowc
)转换为 UTF-32,并通过文字代码点搜索进行拆分。
在string split ''
的情况下,fish会将输入转换为UTF-32,按代码点拆分,并分别输出每个代码点,转换为用户的语言环境。分解的字符和其他字形簇可能会被拆分。
Shell 不太适合 Unicode-savvy 文本处理。