В чем разница между UTF-8 и Unicode?

Прежде всего, я предполагаю, что вам нужны связанные списки. На практике вы можете использовать collections.deque, чья текущая реализация CPython представляет собой двусвязный список блоков (каждый блок содержит массив из 62 грузовых объектов). Он включает функциональность связанного списка. Вы также можете найти расширение C, названное llist на pypi. Если вам нужна чистая-Python и простая в использовании реализация связанного списка ADT, вы можете взглянуть на мою следующую минимальную реализацию.

class Node (object):
    """ Node for a linked list. """
    def __init__ (self, value, next=None):
        self.value = value
        self.next = next

class LinkedList (object):
    """ Linked list ADT implementation using class. 
        A linked list is a wrapper of a head pointer
        that references either None, or a node that contains 
        a reference to a linked list.
    """
    def __init__ (self, iterable=()):
        self.head = None
        for x in iterable:
            self.head = Node(x, self.head)

    def __iter__ (self):
        p = self.head
        while p is not None:
            yield p.value
            p = p.next

    def prepend (self, x):  # 'appendleft'
        self.head = Node(x, self.head)

    def reverse (self):
        """ In-place reversal. """
        p = self.head
        self.head = None
        while p is not None:
            p0, p = p, p.next
            p0.next = self.head
            self.head = p0

if __name__ == '__main__':
    ll = LinkedList([6,5,4])
    ll.prepend(3); ll.prepend(2)
    print list(ll)
    ll.reverse()
    print list(ll)
437
задан trentcl 6 July 2019 в 11:54
поделиться

6 ответов

Чтобы подробно остановиться на других ответов дали:

у Нас есть много языков с большим количеством символов, которые должны идеально отобразить компьютеры. Unicode присваивает каждому символу уникальный номер или кодовую точку.

Компьютерное соглашение с такими числами как байты... пропускающие немного истории здесь и игнорирующие проблемы решающего памяти, 8-разрядные компьютеры, рассматривало бы 8-разрядный байт как самую большую числовую единицу, легко представленную на аппаратных средствах, 16-разрядные компьютеры развернут это до двух байтов и т.д.

Старые кодировки символов, такие как ASCII от (пред-) 8-разрядная эра и пытаются переполнить доминантный язык в вычислениях в то время, т.е. английский язык, в числа в пределах от от 0 до 127 (7 битов). С 26 буквами в алфавите, и в капитале и в непрописной форме, числах и знаках пунктуации, которые работали вполне прилично. ASCII был расширен 8-м битом для другого, неанглийские языки, но дополнительные 128 чисел/кодовых точек сделали доступным этим расширением, будут отображены на различных символах в зависимости от отображаемого языка. Стандарты ISO 8859 являются наиболее распространенными формами этого отображения; ISO-8859-1 и ISO-8859-15 (также известный, поскольку ISO-Latin-1, latin1, и да там являются двумя различными версиями 8 859 стандартов ISO также).

, Но это недостаточно, когда Вы хотите представить символы больше чем с одного языка, таким образом, зубрежка все доступные символы в единственный байт просто не будет работать.

существует по существу два различных типов кодировки: каждый разворачивает диапазон значений путем добавления большего количества битов. Примерами этой кодировки был бы UCS2 (2 байта = 16 битов) и UCS4 (4 байта = 32 бита). Они страдают от по сути той же проблемы как ASCII и стандарты ISO 8859, как их диапазон значений все еще ограничен, даже если предел значительно выше.

другой тип кодирования использования переменное число байтов на символ и обычно известная кодировка для этого являются кодировкой UTF. Вся кодировка UTF работает примерно тем же способом: Вы выбираете размер единицы, который для UTF-8 составляет 8 битов, поскольку UTF-16 составляет 16 битов, и для UTF-32 32 бита. Стандарт тогда определяет несколько из этих битов как флаги: если они установлены, то следующую единицу в последовательности единиц нужно считать частью того же символа. Если они не установлены, эта единица представляет один символ полностью. Таким образом наиболее распространенные символы (English) только занимают один байт в UTF-8 (два в UTF-16, 4 в UTF-32), но другие символы языка могут занять шесть байтов или больше.

Многобайтовая кодировка (я должен сказать, что мультиединица после вышеупомянутого объяснения) имеют преимущество, что они относительно эффективны пространством, но оборотная сторона, что операции, такие как нахождение подстрок, сравнений, и т.д. все должны декодировать символы к unicode кодовым точкам перед такими операциями, может быть выполнена (существуют некоторые ярлыки, хотя).

И стандарты UCS и стандарты UTF кодируют кодовые точки, как определено в Unicode. В теории та кодировка могла использоваться для кодирования любого числа (в диапазоне поддержки кодирования) - но конечно эта кодировка была сделана закодировать кодовые точки Unicode. И это - Ваши отношения между ними.

Windows обрабатывает так называемые строки "Unicode" как строки UTF-16, в то время как большая часть значения по умолчанию UNIXes к UTF-8 в эти дни. Коммуникационные протоколы, такие как HTTP имеют тенденцию работать лучше всего с UTF-8, поскольку размер единицы в UTF-8 совпадает с в ASCII, и большинство таких протоколов было разработано в эру ASCII. С другой стороны, UTF-16 дает лучшее среднее число производительность пространства/обработки при представлении всех живых языков.

стандарт Unicode определяет меньше кодовых точек, чем можно представить в 32 битах. Таким образом для всех практических целей, UTF-32 и UCS4 стали тем же кодированием, как Вам придется вряд ли иметь дело с символами мультиединицы в UTF-32.

Hope, которая заполняет некоторые детали.

440
ответ дан Scott Tesler 6 July 2019 в 21:54
поделиться

Они не то же самое - UTF-8 является конкретным способом закодировать Unicode.

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

107
ответ дан Greg 6 July 2019 в 21:54
поделиться

"Unicode", к сожалению, используется всевозможными способами, в зависимости от контекста. Его самое корректное использование (IMO) как кодированный набор символов - т.е. ряд символов и отображения между символами и целым числом кодовые точки представление их.

UTF-8 является кодировкой символов - способ преобразовать из последовательностей байтов к последовательностям символов и наоборот. Это покрывает весь набор символов Unicode. ASCII кодируется как единственный байт на символ, и другие символы берут больше байтов в зависимости от своей точной кодовой точки (до 4 байтов для всех в настоящее время определяемых кодовых точек, т.е. до U-0010FFFF, и действительно 4 байта могли справиться до U-001FFFFF).

, Когда "Unicode" используется в качестве названия кодировки символов (например, как.NET Кодирование. Свойство Unicode ) это обычно означает UTF-16, который кодирует наиболее распространенные символы двумя байтами. Некоторые платформы (особенно.NET и Java) используют UTF-16 в качестве своей "собственной" кодировки символов. Это приводит к волосатым проблемам, если необходимо волноваться о символах, которые не могут быть закодированы в единственном значении UTF-16 (они кодируются как "суррогатные пары") - но большинство разработчиков никогда не волнуется об этом, IME.

Некоторые ссылки на Unicode:

194
ответ дан Andrew Tobilko 6 July 2019 в 21:54
поделиться

Unicode только определяет кодовые точки , то есть, число, которое представляет символ. То, как Вы храните эти кодовые точки в памяти, зависит кодирование , что Вы используете. UTF-8 является одним способом закодировать символы Unicode среди многих других.

63
ответ дан Martin Cote 6 July 2019 в 21:54
поделиться

Unicode является просто стандартом, который определяет набор символов ( UCS) и кодировка ( UTF) для кодирования этого набора символов. Но в целом, Unicode отнесен в набор символов а не стандарт.

Read Абсолютный минимум Каждый Разработчик программного обеспечения Absolutely, Положительно Должен Знать О Unicode и Наборах символов (Никакие Оправдания!) и Unicode За 5 Минут .

24
ответ дан Gumbo 6 July 2019 в 21:54
поделиться

Эта статья объясняет все подробности http://kunststube.net/encoding/

ЗАПИСЬ ДЛЯ БУФЕРИЗАЦИИ

, если Вы запишете в 4-байтовый буфер, символ с кодированием UTF8, то Ваш двоичный файл будет похож на это:

00000000 11100011 10000001 10000010

, если Вы пишете в 4-байтовый буфер, символ с кодированием UTF16, Ваш двоичный файл будет похож на это:

00000000 00000000 00110000 01000010

, Как Вы видите, в зависимости от какого языка Вы использовали бы в своем содержании, это произведет Вашу память соответственно.

, например, Для этого конкретного символа: кодирование UTF16 более эффективно, так как у нас есть 2 запасных байта для использования для следующего символа. Но это не означает, что необходимо использовать UTF16 для алфавита Японии.

ЧТЕНИЕ ИЗ БУФЕРА

Теперь, если Вы хотите считать вышеупомянутые байты, необходимо знать, в каком кодирование его было записано в и декодирует его назад правильно.

, например, Если Вы декодируете это: 00000000 11100011 10000001 10000010 в кодирование UTF16, Вы закончите с не

Примечание: Кодирование и Unicode являются двумя разными вещами. Unicode является большим (таблица) с каждым символом, отображенным на точке уникального кода. например, символ (буква) имеет (кодовая точка) : 30 42 (шестнадцатеричное число). Кодирование, с другой стороны, алгоритм, который преобразовывает символы в более соответствующий путь при хранении к аппаратным средствам.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

enter image description here

0
ответ дан 22 November 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: