web-dev-qa-db-ja.com

String.codePointAtは正確には何をしますか?

最近、Javaで文字列の codePointAt メソッドに遭遇しました。他にもいくつかのcodePointメソッドを見つけました:codePointBeforecodePointCountなど。これらは間違いなくUnicodeと関係があります分かりません。

codePointAtと同様のメソッドをいつどのように使用すべきかを考えます。

34
Michael

短い答え:Stringの指定されたインデックスで始まる nicodeコードポイント を提供します。つまり、その位置にある文字の「Unicode番号」。

より長い答え:Javaは、16ビット(別名char)で十分なときに作成されました存在した任意のUnicode文字(これらの部分は Basic Multilingual PlaneまたはBMP と呼ばれるようになりました)。その後、Unicodeが拡張され、コードポイント> 2の文字が含まれるようになりました16。これは、charがすべての可能なUnicodeコードポイントを保持できなくなったことを意味します。

TF-16 が解決策でした。「古い」Unicodeコードポイントを16ビット(つまり、正確に1つchar)で保存し、すべての新しいコードポイントを32ビット(つまり、2つのchar values)。これらの2つの16ビット値は、「サロゲートペア」と呼ばれます。厳密に言うと、charは、以前のように「Unicode文字」ではなく「UTF-16コード単位」を保持します。

すべての「古い」メソッド(charのみを処理)は、「新しい」Unicode文字をまったく使用しなかった場合(またはそれらを実際に気にしない場合)に問題なく使用できますが、新しい文字も気にかけている場合(または単に完全なUnicodeサポートが必要な場合)、可能なすべてのUnicodeを実際にサポートする「コードポイント」バージョンを使用する必要がありますコードポイント。

注:BMPにないUnicode文字の非常によく知られた例(つまり、コードポイントバリアント)は絵文字です:単純な Grinning Face ???? U + 1F600を単一のcharで表すことはできません。

51
Joachim Sauer

コードポイントは65535を超える文字(Character.MAX_VALUE)をサポートします。

そのような高い文字を含むテキストがある場合は、コードポイントまたはintsではなくcharを使用する必要があります。

これは、1つまたは2つの16ビット文字を使用してintに変換できるUTF-16をサポートすることにより、これを行うものではありません。

AFAIK、一般的にこれは Supplementary MultiligualSupplementary Ideographic に最近追加された、繁体字でない中国語などの文字にのみ必要です。

6
Peter Lawrey

簡単に言うと、Java :)でデフォルトの文字セットを使用している限り、まれですが、より詳細な説明については、以下の投稿を試してください。

charとコードポイントの比較?http://docs.Oracle.com/javase/1.5.0/docs/api/Java/lang/Character.htmlhttp://javarevisited.blogspot.com/2012/01/Java-string-codepoint-get-unicode.html

これがあなたのために物事を明確にするのに役立つことを願っています:)

0
JTMon