语言服务功能中的多语言和表情符号支持
多语言和表情符号支持已导致 Unicode 编码,该编码使用多个码位来表示单个显示的字符(称为字形)。 例如,🌷 和 👍 之类的表情符号可以使用几个字符将形状与其他字符组合起来,以提供视觉对象特性(例如肤色)。 同样,印地语文字 अनुच्छेद
将编码为五个字母和三个组合标记。
由于可能的多语言编码和表情符号编码的长度不同,语言服务功能可能会在响应中返回偏移。
API 响应中的偏移量
每当在 API 响应中返回偏移时,请记住:
- 响应中的元素可能会特定于所调用的终结点。
- HTTP POST/GET 有效负载以 UTF-8 格式进行编码,该编码不一定是客户端编译器或操作系统上的默认字符编码。
- 偏移量是指基于 Unicode 8.0.0 标准的字形计数,而不是字符计数。
从具有偏移量的文本中提取子字符串
使用基于字符的子字符串方法(例如 .NET substring() 方法)时,偏移量可能会导致问题。 一个问题是,偏移量可能导致子字符串方法在多字符字形编码的中间而不是结尾处结束。
在 .NET 中,考虑使用 StringInfo 类,该类使你可以将字符串作为一系列文本元素(而不是单个字符对象)来处理。 也可以在首选软件环境中查找字形拆分器库。
为方便起见,语言服务功能也会返回这些文本元素。
返回偏移的终结点将支持 stringIndexType
参数。 此参数在 API 输出中调整 offset
和 length
属性,以匹配请求的字符串迭代方案。 目前,我们支持三种类型:
textElement_v8
(默认值):根据 Unicode 8.0.0 标准的定义循环访问字形unicodeCodePoint
:循环访问 Unicode 码位(Python 3 的默认方案)utf16CodeUnit
:循环访问 UTF-16 代码单元(JavaScript、Java 和 .NET 的默认方案)
如果请求的 stringIndexType
与所选的编程环境相匹配,则可以使用标准子字符串或切片方法提取子字符串。