UTF-8, UTF-16 и UTF-32

Я искал решение на весь этот день. И вот те выводы, которые я сделал:

  1. По соображениям безопасности Opera и Firefox не позволяют запускать ввод файла.
  2. Единственная удобная альтернатива - создать «скрытый» ввод файла (с использованием непрозрачности, а не «скрытый» или «дисплей: нет»!), а затем создайте кнопку «ниже». Таким образом, кнопка видна, но при нажатии на нее пользователь фактически активирует ввод файла.

Надеюсь, это поможет! :)

<div style="display: block; width: 100px; height: 20px; overflow: hidden;">
<button style="width: 110px; height: 30px; position: relative; top: -5px; left: -5px;"><a href="javascript: void(0)">Upload File</a></button>
<input type="file" id="upload_input" name="upload" style="font-size: 50px; width: 120px; opacity: 0; filter:alpha(opacity=0);  position: relative; top: -40px;; left: -20px" />
</div>
444
задан Peter Mortensen 4 January 2017 в 18:22
поделиться

7 ответов

UTF-8 имеет преимущество в случае, где символы ASCII представляют большинство символов в блоке текста, потому что UTF-8 кодирует все символы в 8 битов (как ASCII). Это также выгодно в этом, файл UTF-8, содержащий только символы ASCII, имеет то же кодирование ASCII-файлом.

UTF-16 лучше, где ASCII не преобладает, так как он использует 2 байта за символ, прежде всего. UTF-8 начнет использовать 3 или больше байта для символов высшего порядка, где UTF-16 остается на уровне всего 2 байтов для большинства символов.

UTF-32 покроет все возможные символы в 4 байтах. Это делает это довольно чрезмерно увеличенным в размерах. Я не могу думать ни о каком преимуществе для использования его.

341
ответ дан fuzzybear3965 5 January 2017 в 04:22
поделиться
  • 1
    Я don' t думают станд.:: пара предоставляет любым конструкторам или операторам для ее участников. О чем точно Вы думаете? – Manuel 10 February 2010 в 21:16

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

символы In UTF-8 имеют переменную длину, символы ASCII кодируются в одном байте (восемь битов), большинство западных специальных символов кодируется или в двух байтах или в трех байтах (например, в‚ ¬ составляет три байта), и более экзотические символы могут взять до четырех байтов. Ясный недостаток, это априорно Вы не можете вычислить длину строки. Но это - партия взятий меньше байтов для кодирования латинского (английского) текста алфавита, по сравнению с UTF-32.

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

Из тех трех, ясно UTF-8 наиболее широко распространение.

13
ответ дан Ahmad F 5 January 2017 в 04:22
поделиться
  • 1
    Хм, кажется, сделал серьезную опечатку в своем комментарии. " Это - ответ, я задавался вопросом about" это должно было быть. Я дал AshleysBrain принятый ответ, как он был, было быстро и дал хороший ответ, точно так же, как Вы. Было трудно выбрать, но я пошел для того, который извлечет выгоду больше всего. – Tamara Wijsman 13 February 2010 в 10:54

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

Однако шрифты, кодирование и вещи являются злобно сложными (излишне?), таким образом, большая ссылка необходима для заполнения более подробно:

http://www.cs.tut.fi/~jkorpela/chars.html#ascii

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

Paul.

2
ответ дан Paul W Homer 5 January 2017 в 04:22
поделиться
  • UTF-8 переменный 1 - 4 байты.

  • UTF-16 переменный 2 или 4 байты.

  • UTF-32 фиксируется 4 байты.

108
ответ дан Peter Mortensen 5 January 2017 в 04:22
поделиться
  • 1
    Хорошая идея, будет на потом иметь это в виду. – Tamara Wijsman 13 February 2010 в 10:55

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

, Но для того, чтобы сохранить и обмениваться данными я всегда использовал бы UTF-8, если у Вас есть выбор. Если у Вас будут главным образом данные ASCII, то это даст Вам самый маленький объем данных для передачи, в то время как все еще способность закодировать все. Оптимизация для наименьшего количества ввода-вывода является способом пойти на современные машины.

6
ответ дан Peter Mortensen 5 January 2017 в 04:22
поделиться

Unicode определяет единственный огромный набор символов, присваивая одно уникальное целочисленное значение каждому графическому символу (который является основным упрощением и не на самом деле верен, но это достаточно близко в целях этого вопроса). UTF-8/16/32 просто различные способы закодировать это.

Короче говоря, UTF-32 использует 32-разрядные значения для каждого символа. Это позволяет им использовать код фиксированной ширины для каждого символа.

использование UTF-16, 16-разрядное по умолчанию, но который только дает Вам 65k возможные символы, который нигде не является около достаточно для полного набора Unicode. Таким образом, некоторые символы используют пар 16-разрядных значений.

И UTF-8 использует 8-разрядные значения по умолчанию, что означает, что 127 первых значений являются однобайтовыми символами фиксированной ширины (старший значащий бит используется, чтобы показать, что это - запуск многобайтовой последовательности, оставляя 7 битов для фактического символьного значения). Все другие символы кодируются как последовательности до 4 байтов (если не изменяет память).

И это приводит нас к преимуществам. Любой символ ASCII непосредственно совместим с UTF-8, таким образом, для обновления приложений прежней версии, UTF-8 является общим и очевидным выбором. Почти во всех случаях это будет также использовать наименьшее количество памяти. С другой стороны, Вы не можете сделать гарантии о ширине символа. Это может быть 1, 2, 3 или 4 широкие символа, который делает обработку строк трудной.

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

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

Наконец, часто полезно просто пойти с какой поддержка платформ. Windows использует UTF-16 внутренне, таким образом, в Windows, который является очевидным выбором.

Linux варьируется немного, но они обычно используют UTF-8 для всего, что совместимо Unicode.

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

74
ответ дан Peter Mortensen 5 January 2017 в 04:22
поделиться
  • 1
    Без проблем, но имело бы больше смысла спрашивать о сравнении простоты в употреблении если that' s, что you' ре, заинтересованное. Naveen и я оба ответили на вопрос, как указано. (Не жалоба, просто говоря...) – j_random_hacker 10 February 2010 в 21:15

Короче говоря:

  • UTF-8: кодирование переменной ширины, назад совместимое с ASCII. Символы ASCII (U+0000 к U+007F) берут 1 байт, кодовые точки, U+0080 к U+07FF берут 2 байта, кодовые точки, U+0800 к U+FFFF берут 3 байта, кодовые точки, U+10000 к U+10FFFF берут 4 байта. Хороший для английского текста, не настолько хорошего для азиатского текста.
  • UTF-16: кодирование переменной ширины. Кодовые точки U+0000 к U+FFFF берут 2 байта, кодовые точки U+10000 к U+10FFFF, берут 4 байта. Плохо для английского текста, хорошего для азиатского текста.
  • UTF-32: кодирование фиксированной ширины. Все кодовые точки берут четыре байта. Огромный пожиратель ресурсов памяти, но быстро воздействовать на. Редко используемый.

В долго: посмотрите Википедию: UTF-8, UTF-16, и UTF-32.

302
ответ дан Adam Rosenfield 5 January 2017 в 04:22
поделиться
  • 1
    +1 для комментария обслуживания. Я работал с группой инженеров от NJ, которые пытались сделать все (и я имею в виду все) с STL, и вместо того, чтобы создать соответствующие классы/структуры, когда дизайн указал, они использовали контейнер STL. Код был замусорен " если (route.first.second [*iter] .first) {...} ". тьфу! – Don Wakefield 12 February 2010 в 00:50
Другие вопросы по тегам:

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