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之间拆分?
答案 0 :(得分:1)
string split
对wchar_t
的序列进行操作。在具有典型用法的Unix / Linux中,输入通过用户的语言环境(使用mbrtowc
转换为UTF-32,并通过文字代码点搜索进行拆分。
对于string split ''
,fish将把输入转换为UTF-32(按代码点分割),并分别输出每个代码点,并转换为用户的语言环境。分解后的字符和其他字素簇可能会分裂。
Shell不太适合用于支持Unicode的文本处理。