多言語と絵文字のサポートにより、複数の コード ポイント を使用して 1 つの表示文字 (grapheme と呼ばれる) を表す Unicode エンコードが実現されます。 たとえば、🌷や👍のような絵文字では、スキン トーンなどの視覚的属性を表現するために追加の文字を含めて、図形を作成するためにいくつかの文字を使用することがあります。 同様に、ヒンディー語の अनुच्छेद は、5 つの文字と 3 つの結合記号としてエンコードされます。
可能な多言語エンコードと絵文字エンコードの長さが異なるため、言語機能は応答のオフセットを返す場合があります。
API 応答のオフセット
API 応答でオフセットが返されるたびに、次の点に注意してください。
- 応答内の要素は、呼び出されたエンドポイントに固有のものである可能性があります。
- HTTP POST/GET ペイロードは UTF-8 でエンコードされます。これは、クライアント側コンパイラまたはオペレーティング システムの既定の文字エンコードである場合もそうでない場合もあります。
- オフセットでは、文字の数ではなく Unicode 8.0.0 標準に基づく書記素の数が参照されます。
オフセットを使用したテキストからの部分文字列の抽出
文字ベースの部分文字列メソッドを .NET substring () メソッドなどで使用すると、オフセットによる問題が発生する可能性があります。 問題の 1 つとして、オフセットが原因で、部分文字列メソッドが複数文字の書記素エンコードの末尾ではなく途中で終了することがあります。
.NET では、StringInfo クラスを使用することを検討してください。これにより、個々の文字オブジェクトではなく、一連のテキスト要素として文字列を操作できます。 任意のソフトウェア環境で、書記素スプリッター ライブラリを検索することもできます。
言語機能は、便宜上、これらのテキスト要素も返します。
オフセットを返すエンドポイントは、 stringIndexType パラメーターをサポートします。 このパラメーターは、要求された文字列反復スキームに一致するように、API 出力内の offset と length 属性を調整します。 現時点では以下の 3 種類がサポートされています。
-
textElement_v8(既定値):graphemes標準で定義されているを反復処理します -
unicodeCodePoint: Python 3 の既定のスキームであるUnicode コード ポイントを繰り返します -
utf16CodeUnit: Javascript、Java、.NET の既定のスキームである UTF-16 コード単位を繰り返します
要求された stringIndexType が、選択したプログラミング環境に一致する場合は、標準の substring または slice メソッドを使用して部分文字列を抽出できます。