最近、Javaで文字列の codePointAt メソッドに遭遇しました。他にもいくつかのcodePointメソッドを見つけました:codePointBefore
、codePointCount
など。これらは間違いなくUnicodeと関係があります分かりません。
codePointAt
と同様のメソッドをいつどのように使用すべきかを考えます。
短い答え: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
で表すことはできません。
コードポイントは65535を超える文字(Character.MAX_VALUE)をサポートします。
そのような高い文字を含むテキストがある場合は、コードポイントまたはint
sではなくchar
を使用する必要があります。
これは、1つまたは2つの16ビット文字を使用してint
に変換できるUTF-16をサポートすることにより、これを行うものではありません。
AFAIK、一般的にこれは Supplementary Multiligual と Supplementary Ideographic に最近追加された、繁体字でない中国語などの文字にのみ必要です。
簡単に言うと、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
これがあなたのために物事を明確にするのに役立つことを願っています:)