私はJavaでStringクラスの関数を理解しようとしています。だから、ここで簡単なコードされます:offsetByCodePointsが実際に引数として取るJava関数は何ですか?
/* different experiments with String class */
public class TestStrings {
public static void main(String[] args) {
String greeting = "Hello\uD835\uDD6b";
System.out.println("Number of code units in greeting is " + greeting.length());
System.out.println("Number of code points " + greeting.codePointCount(0,greeting.length()));
int index = greeting.offsetByCodePoints(0,6);
System.out.println("index = " + index);
int cp = greeting.codePointAt(index);
System.out.println("Code point at index is " + (char) cp);
}
}
uD835 \ uDD6b \ℤのシンボルであるので、それは大丈夫サロゲートペアです。
文字列には6(6)コードポイントと7(7)コード単位(2バイト文字)があります。それはドキュメントでありますよう:
offsetByCodePoints
public int offsetByCodePoints(int index, int codePointOffset)
がcodePointOffsetコードポイントによって指定されたインデックスからオフセットされて、このString内のインデックスを返します。 indexおよびcodePointOffsetによって指定されたテキスト範囲内の対になっていないサロゲートは、それぞれ1つのコードポイントとしてカウントされます。
パラメータ:
index
- インデックスが
codePointOffset
を相殺するために - だから我々はコードポイントに引数を与えないコードポイント
にオフセット。しかし、与えられた引数(0,6)では、例外なく、うまく動作します。しかし、コードポイント(7)は範囲外ですので、codePointAt()は失敗します。だから、関数がコード単位でargを取得するのでしょうか?または私は何かを逃した。
ありがとうございます!しかし、議論されたコードに関する*奇妙なことは、int index = greeting.offsetByCodePoints(0,6)です。実際には6ではなく7を返す!コードポイント(0から数えて)が最大のコードユニットのインデックスが6と5であると仮定すると、それはかなり奇妙に見えます。 –
@UgnichenkoDmitriy、Ah。 javadocを読み返す際には、 'offsetByCodePoints'はcharインデックスを返します。私の投稿を編集しました。 –
ああ、あなたは私を愚かだと呼ぶかもしれませんが、まだ得られない - この7(7)はどこから来ますか?最大のインデックスは6です。つまり、最初の文字(またはコード単位)のインデックスが0の場合です。しかし、7はどこから来ますか?うん、私たちは7つの文字を持っていますが、私が言ったように、インデックスでは少し違います。 –