Кодировки для разных языков и эмодзи в компонентах языковой службы

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

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

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

См. также раздел