шпагат рыбы и иностранные языки - PullRequest
0 голосов
/ 05 июля 2019

быстрый вопрос о встроенной функции 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 поможет мне подумать, если предположить, что это действительно какая-то ошибка.

РЕДАКТИРОВАТЬ: лучший способ сформулировать мой вопрос: разделить ли функция string split рыбы между всеми графемами, определенными UTF, или просто UFT-8 / UTF-16?

1 Ответ

1 голос
/ 05 июля 2019

string split работает с последовательностями wchar_t.В Unix / Linux при обычном использовании входные данные преобразуются в UTF-32 через локаль пользователя (с использованием mbrtowc), а расщепление происходит посредством поиска буквальной кодовой точки.

В случае string split '' fishпреобразует ввод в UTF-32, разделенный по кодовой точке, и выводит каждую кодовую точку отдельно, преобразованную в локаль пользователя.Разложенные символы и другие кластеры графем могут быть разделены.

Оболочки плохо подходят для обработки текста, удобного для Unicode.

...