Поделиться через


Поддержка многоязычности и эмодзи в функциях языковых сервисов

Поддержка многоязычности и эмодзи требует применения кодировок Юникод, в которых для представления одного отображаемого символа, называемого графемой, используется более одной кодовой точки. Например, для таких эмодзи, как 🌷 и 👍, могут использоваться несколько символов, образующих фигуру с дополнительными символами для визуальных атрибутов, таких как тон кожи. Аналогично слово अनुच्छेद (на языке хинди) кодируется как пять букв и три объединяющих знака.

Поскольку закодированные эмодзи и слова на различных языках имеют разную длину, функции языковой службы могут возвращать смещения в ответах.

Смещения в ответе API

Всякий раз, когда в ответе API возвращаются смещения, помните:

  • Элементы в ответе могут быть специфичны для точки доступа, которая была вызвана.
  • Полезные данные HTTP-запросов POST/GET кодируются в UTF-8, что может не совпадать с кодировкой символов, установленной по умолчанию в вашем компиляторе на стороне клиента или операционной системе.
  • Смещение относится к количеству графем по стандарту Юникод 8.0.0, а не к количеству символов.

Извлечение подстрок из текста с использованием смещений

Из-за смещений могут возникать проблемы при использовании методов обработки подстрок на основе символов, например метода .NET substring(). Одна из проблем со смещением заключается в том, что метод обработки подстрок может завершить работу не в конце, а в середине графемы, закодированной несколькими символами.

Если вы используете .NET, попробуйте применить класс StringInfo, который позволяет работать со строкой как с последовательностью текстовых элементов, а не как с отдельными объектами-символами. Вы также можете поискать библиотеки разделителей графем в той программной среде, в которой работаете.

Компоненты языковой службы также возвращают эти текстовые элементы для вашего удобства.

Конечные точки, возвращающие смещение, будут поддерживать параметр stringIndexType. Он корректирует атрибуты offset и length в выходных данных API в соответствии с запрошенной схемой итерации строк. В настоящее время поддерживаются три типа:

  • textElement_v8 (по умолчанию): выполняет итерации по графемам, как определено в стандарте Юникод 8.0.0.
  • unicodeCodePoint: выполняет итерации по кодовым точкам Юникода (схема по умолчанию для Python 3).
  • utf16CodeUnit: выполняет итерации по единицам кода UTF-16 (схема по умолчанию для JavaScript, Java и .NET).

Если запрошенный параметр stringIndexType соответствует выбранной среде программирования, для извлечения подстрок можно использовать стандартные методы обработки подстрок или срезов.

См. также