2014-11-18 2 views
1

Мы обновляем нашу базу данных до 11g, а также конвертируем все в Unicode. После чтения в Интернете я узнал, что каждый символ в строке может принимать 1, 2 или 4 байта.Размер символов в unicode

Мне было интересно, как система может узнать количество байт, которое занимает символ. Есть ли зарезервированный бит в каждом байте в кодировке Unicode, который говорит, что «этот символ 2 байта»?

+2

Зависит от кодировки. –

+0

Нет такой вещи, как персонаж. В зависимости от того, что вы делаете, вам может понадобиться понять различия между глифами (может быть очень длинными), кодовыми точками, кодовыми единицами и другими. http://utf8everywhere.org для универсального магазина о том, как делать все правильно. –

ответ

1

Характер Юникод как таковой является абстрактным понятием. Когда символы кодируются как строки байтов, они могут иметь разную длину. В UTF-32 каждый символ имеет 4 байта. В UTF-16 каждый символ имеет 2 или 4 байта. В UTF-8 каждый символ равен 1, 2, 3 или 4 байтам.

В UTF-16 первые два байта определяют, есть ли еще два байта. Дополнительные байты присутствуют, если количество, определяемое первыми двумя байтами, находится в определенном диапазоне, называемом «высокие суррогаты».

В UTF-8 битовая диаграмма первого байта определяет количество байтов для символа. Если самый старший бит равен 0, есть только этот байт (поэтому символы Ascii представлены так же, как в Ascii). Если первые три бита равны 110, то имеется еще один байт. Если первые четыре бита - 1110, еще два байта, а если 1111 - еще три байта.

Если вы берете произвольный байт из потока UTF-8, вы не можете вообще решить, является ли это частью представления 2, 3 или 4 байта. Если это один из шаблонов, описанных для стартового байта, вы знаете, что это такое. Но если он начинается с бит 10, вы не можете знать.

Это означает, что поток UTF-8 должен обрабатываться последовательно. Непосредственная адресация по положению персонажа невозможна; чтобы найти N-го символа, вам нужно начать чтение с начала и наблюдать битовые шаблоны стартовых байтов.

3

Во-первых, имейте в виду, что между Unicode и конкретной кодировкой существуют существенные различия. Существует несколько способов кодирования Unicode (UTF-8, UTF-16 и UTF-32, являющихся тремя наиболее распространенными), каждый из которых имеет разные свойства. Кажется, вы описываете свойства кодировки UTF-8.

Да, ведущий бит (ы) в каждом байте кодированной строки UTF-8 указывает, сколько байтов используется конкретным символом. В статье Википедии на странице UTF-8 encoding показаны различные битовые шаблоны для каждого байта для 1, 2, 3 и 4 байтовых символов.