2016-07-12 11 views
2

ich eine Reihe von Tests für die Größe eines String zu schaffen, dies zu tun ich etwas mit wie diese myString.getBytes("UTF-8").length > MAX_SIZE für die Java eine geprüfte Ausnahme UnsupportedEncodingException hat.String, der in UTF-8 nicht dargestellt werden kann

Nur aus Neugier und um weitere mögliche Testszenarien zu berücksichtigen, gibt es einen Text, der nicht durch UTF-8-Zeichencodierung dargestellt werden kann?

BTW: Ich habe meine Hausaufgaben gemacht, aber nirgends (das kann ich finden) gibt an, dass UTF-8/Unicode tatsächlich ALLE möglichen Zeichen enthält. Ich weiß, dass seine Größe 2^32 ist und viele von ihnen sind noch leer, aber die Frage bleibt.

+0

Was ist, wenn der String bereits mit etwas anderem kodiert ist? –

+0

soweit mein Verständnis reicht UTF-8 sollte in der Lage sein, * jede andere Kodierung * einzuschließen (bitte nimm dieses Literal nicht, es ist nichts als eine Annahme) – Ordiel

+0

UTF-8 ist eine Möglichkeit, den gesamten Unicode-Code zu kodieren . UTF-16 ist ein anderer. Alle bekannten Unicode-Codepunkte können sowohl in UTF-8 als auch in UTF-16 codiert werden. UTF-8 benötigt dafür bis zu 4 Byte, UTF-16 bis zu zwei 16-Bit-Werte. Aber nicht alle 4-Byte-Kombinationen sind gültige UTF-8- oder UTF-16-Codepunkte. –

Antwort

2

The official FAQ from the Unicode Consortium ist ziemlich klar in der Sache, und ist eine große Quelle von Informationen über alle in UTF-8 Fragen, UTF-16, usw.

Insbesondere bemerkt die folgende Zitat (Hervorhebung von mir):

Frage: Was ist ein UTF?

A: Ein Unicode Transformation Format (UTF) ist eine algorithmische Abbildung von jedem Unicode-Codepunkt (Ausnahme Surrogat Codepunkte) auf eine eindeutige Bytesequenz. Der ISO/IEC 10646-Standard verwendet den Begriff "UCS-Transformationsformat" für UTF; die beiden Begriffe sind lediglich Synonyme für das gleiche Konzept.

Jede UTF ist umkehrbar, so dass jeder UTF lossless runde Auslöse unterstützt: wieder Abbildung von jede Unicode codierte Zeichensequenz S zu einer Bytefolge und Rückseite S erzeugen. Um zu gewährleisten, runden Auslösung, ein UTF-Mapping alle Codepunkte auf der Karte muss (außer Surrogat Codepunkte), um einzigartige Byte-Sequenzen. Dazu gehören reservierte (nicht zugewiesene) Codepunkte und die 66 Nicht-Zeichen (einschließlich U + FFFE und U + FFFF).

So, wie Sie per Definition sehen können, alle UTF-Codierungen (einschließlich UTF-8) muss in der Lage sein zu handhaben alle Unicode-Codepunkte (mit Ausnahme der Ersatzcodepunkte natürlich, aber sie sind nicht real Zeichen sowieso).

Zusätzlich hier ist ein Zitat direkt aus den Unicode Standard, die auch darüber spricht:

Der Unicode-Standard unterstützt drei Zeichencodierung Formen: UTF-32, UTF-16 und UTF-8. Jedes Codierungsformular bildet die Unicode-Codepunkte U + 0000..U + D7FF und U + E000..U + 10FFFF auf eindeutige Codeeinheitssequenzen ab.

Wie Sie sehen können, deckt der angegebene Zeichenbereich den gesamten zugewiesenen Unicode-Bereich ab (natürlich nicht den Ersatzzeichenbereich).

+0

Danke speziell für die hervorragende Bibliographie! – Ordiel

0

Gibt es einen Text, der nicht durch eine UTF-8-Zeichencodierung dargestellt werden kann?

Java-Strings verwenden UTF-16 und Standard UTF-8 ist so konzipiert, zu handhaben jeder Unicode Codepoint, dass UTF-16 verarbeiten kann (und dann einige).

Allerdings vorsichtig sein, weil Java auch in einigen Bereichen ein Modified UTF-8 verwendet, und das hat einige Unterschiede/Einschränkungen von Standard UTF-8.