2016-07-12 1 views
2

Stringのサイズのテストを作成しています。これはmyString.getBytes("UTF-8").length > MAX_SIZEのようなものを使用していますが、javaにはチェック例外UnsupportedEncodingExceptionがあります。文字列がUTF-8で表現できない

ちょうど好奇心のために、さらに他の可能なテストシナリオを検討して、UTF-8文字エンコーディングで表現できない文字はありますか?

ところで:私は私の宿題をしましたが、どこにも(私は見つけることができるということは)実際にUTF-8/Unicodeが可能であり、すべての文字が含まれていることを指定します。私はそのサイズが2^32であることを知っていて、それらの多くはまだ空ですが、質問は残っています。

+0

文字列がすでに何か他のものを使用してエンコードされている場合はどうなりますか? –

+0

UTF-8は他のエンコーディング*を取り囲むことができるはずです(このリテラルは使用しないでください)。 – Ordiel

+0

UTF-8はUnicodeコードセット全体をエンコードする1つの方法です。 UTF-16は別のものです。すべての既知のUnicodeコードポイントは、UTF-8とUTF-16でエンコードできます。 UTF-8には最大4バイト、UTF-16は最大2つの16ビット値が必要です。ただし、有効なUTF-8またはUTF-16コードポイントは4バイトの組み合わせであるとは限りません。 –

答えて

2

The official FAQ from the Unicode Consortiumは、以下の引用(強調鉱山)を気づくなど、特に

問題についてかなり明確で、UTF-8に関連するすべての質問に関する情報の偉大な源である、UTF-16:

Q:UTFとは?

A:ユニコード変換フォーマット(UTF)ユニークなバイトシーケンス(サロゲート コードポイント以外)毎 Unicodeコードポイントから アルゴリズムのマッピングです。 ISO/IEC 10646規格 は、UTFに「UCS変​​換フォーマット」という用語を使用しています。 2つの用語は同じ概念の同義語である です。任意ののUnicode符号化文字列S からバイトや背中の シーケンスへのマッピングは、再びSが生成されます:

各UTFは可逆的である。したがって、すべてのUTFはトリップロスレスラウンド をサポートしています。 がトリップラウンド確保するために、UTFマッピングはユニークなバイト配列にすべてコードポイント(サロゲート コードポイント除く)をマッピングする必要があります。これは、予約 (未割り当て)コードポイント及び(U + FFFE とU + FFFFを含む)66 noncharactersを含みます。

あなたが見ることができるように、定義により、(UTF-8を含む)すべてのUTFエンコーディングはもちろんのサロゲートコードポイントを除いて(すべて Unicodeコードポイントを処理できなければならないが、彼らはありますいいえ文字はとにかく)。

はさらに、ここにもこのことについて語ってUnicode Standardから直接の引用です:UTF-32、 UTF-16、およびUTF-8:

は、Unicode標準は、3つの文字エンコーディング形式をサポートしています。各エンコード形式は、ユニコードコードポイント U + 0000..U + D7FFとU + E000..U + 10FFFFをユニコードコードシーケンスにマップします。

ご覧のとおり、指定された文字範囲は、割り当てられたUnicode範囲全体(もちろん代理文字範囲を除く)をカバーします。

+0

特に優れた参考文献をありがとう! – Ordiel

0

UTF-8文字エンコーディングでは表現できないテキストはありますか?

Java文字列は、UTF-16、および標準UTF-8を使用するすべての UnicodeはUTF-16は、(その後、いくつか)を扱うことができるコードポイント処理するように設計されています。

ただし、Java でもは一部の地域でModified UTF-8を使用しており、標準のUTF-8とはいくつかの違いがありますので注意してください。

関連する問題