Как указывает axtavt, концепция n-байтовых символов Unicode не имеет смысла; если вы имеете в виду UTF-8, то очень простая таблица, которая может помочь вам с тестированием и т. д., может выглядеть следующим образом. Обратите внимание, что все примеры символов работают в моем браузере (Chrome в Ubuntu), но ваш пробег может отличаться в зависимости от отображения, копирования / вставки и т. Д.
UTF-8 bytes Start End Example Character
1 U+0000 U+007F ! EXCLAMATION MARK U+0021)
2 U+0080 U+07FF ¶ PILCROW SIGN (U+00B6)
3 U+0800 U+FFFF ‱ PER TEN THOUSAND SIGN (U+2031)
4 U+10000 U+1FFFFF ??? MUSICAL SYMBOL SIXTEENTH NOTE (U+1D161)
Теоретически в UTF-8 могут быть 5- или 6-байтовые значения, но 32-битное адресное пространство Unicode в действительности ограничено максимумом 10FFFF, поэтому более 4 байтов не требуется.
Обратите внимание, что здесь есть важное предупреждение: Java char
- это , а не символ Unicode; это 16-битная кодовая единица UTF-16, и весьма часто можно видеть потоки данных, которые обрабатывают не-BMP-символ (как U + 1D161 выше) как 2 символа, и UTF-8 это соответственно. Например:
Character: U+1D161
UTF-8 encoding: 0xF0 0x9D 0x85 0xA1
UTF-16 encoding: 0xD834 0xDD61
UTF-16 code points individually encoded as UTF-8: 0xED 0xA0 0xB4 0xED 0xB5 0xA1
Обратите внимание, что это имеет эффект , по-видимому , показывая 6-байтовый символ UTF-8, но на самом деле это не разрешено UTF-8. UTF-8 должен быть кодированием исходных кодовых точек, а не кодированием кодовых единиц UTF-16, которые представляют эти точки. Это не значит, что вы не видите это в дикой природе, хотя ...