UTF-8 или UTF-16 или UTF-32 или UCS-2

Я разрабатываю новый CMS, но хочу разработать его для установки всем моим будущим потребностям как Многоязычное содержание, таким образом, я думал, что Unicode (UTF-8) является лучшим решением

Но с некоторым поиском я получил эту статью

http://msdn.microsoft.com/en-us/library/bb330962%28SQL.90%29.aspx#intlftrql2005_topic2

Таким образом, я теперь смущен, что использовать теперь UTF-8 / UTF-16 / UTF-32 / UCS-2

который лучше для Многоязычного содержания и производительности и т.д.

PS: я использую Asp.net и c# и SqlServer 2005

Заранее спасибо

10
задан habnabit 13 August 2010 в 01:50
поделиться

5 ответов

Это не проблема, потому что вы говорите:

Я использую Asp.net, C # и SqlServer 2005

SqlServer использует UTF-16 в некоторых местах (ntext, nvarchar, nchar) и UTF-8 в нескольких местах, ориентированных на XML, без каких-либо странных действий.

C # использует UTF-16 во всех своих строках с инструментами для кодирования, когда дело доходит до работы с потоками и файлами, которые приводят нас к ...

ASP.NET по умолчанию использует UTF-8, и трудно представить себе время, когда это не лучший выбор (даже с азиатскими языками, краткость текста таких языков в сочетании с тем фактом, что имена и символы со специальным значением в HTML , CSS, javascript, большинство XML-приложений и других потоков, которые вы будете отправлять, находятся в диапазоне от U + 0000 до U + 007F, что делает преимущество UTF-16 над UTF-8 в этом диапазоне менее значительным, чем с обычным текстом на азиатских языках. ).

Обмен данными между UTF-16 SqlServer и C # и UTF-8, который ASP.NET выполняет при чтении и записи, осуществляется за вас с настройками по умолчанию, но поскольку это единственный бит, который вы можете легко изменить, поэтому мой ответ - использовать UTF-8. На самом деле вы будете использовать смесь -8 и -16, но большую часть времени вы этого не заметите (заметили ли вы, что уже делаете это).

SQL Server немного менее снисходителен, хотя бы потому, что многие устаревшие примеры содержат текст, предназначенный для человеческого употребления, который помещается в поля varchar, text или char. Используйте их исключительно для кодов (например, все коды стран ISO находятся в диапазоне char (2), поэтому nchar (2) просто потратит место), и только nvarchar, ntext и nchar для вещей, которые люди, а не машины будут читать и писать.

13
ответ дан 3 December 2019 в 13:32
поделиться

Прежде всего, забудьте про UCS-2: он устарел. Он содержит только подмножество символов Юникода. Забудьте и о UTF-32: он очень большой и очень избыточный. Это бесполезно для передачи данных.

Для веб-страниц наиболее экономичным является UTF-8, если большинство языков, с которыми вы работаете, похожи на западные (латынь, кириллица, греческий и т. Д.). Но если пропускная способность и время загрузки не являются проблемой, вы также можете использовать UTF-16. Просто убедитесь, что вы всегда знаете, в каком формате находятся данные, когда обрабатываете байт [] . И не пытайтесь преобразовать в устаревшие 8-битные наборы символов, такие как ISO-8859 или Windows-1252, потому что в этом случае вы потеряете данные.

В коде C # ваши объекты string внутри будут находиться в UTF-16, и вы ничего не можете с этим поделать. Таким образом, ваши обычные строковые операции (например, Substring () ) не зависят от выбранного вами формата вывода. Можно утверждать, что это делает кодирование в формате UTF-16 более производительным, но оно того не стоит, если вы собираетесь передавать его через Интернет, где стоимость передачи более крупного UTF-16 перевешивает крошечный выигрыш от обработки.

В SQL Server следует использовать nvarchar (...) .

3
ответ дан 3 December 2019 в 13:32
поделиться

UTF-8 или UTF-16 являются хорошим выбором. . Оба они предоставляют вам доступ ко всему диапазону кодовых точек Unicode без использования 4 байтов для каждого символа.

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

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

2
ответ дан 3 December 2019 в 13:32
поделиться

Краткое примечание: в основном все может быть представлено в наборе символов Unicode . UTF-8 - это всего лишь одна кодировка , которая может представлять все символы в этом наборе.

UCS-2 больше не используется. Он не может содержать символы за пределами U + FFFF.

Какой из оставшихся трех зависит от того, какие операции вы хотите выполнить с текстом. UTF-8 (обычно, не всегда!) Будет занимать меньше места на диске, представляющем те же данные, и является строгим надмножеством ASCII, поэтому он может уменьшить объем необходимого перекодирования. Однако вы не можете проиндексировать свою строку или найти ее длину за постоянное время.

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

1
ответ дан 3 December 2019 в 13:32
поделиться

Итак, я не понимаю, что теперь использовать UTF-8 / UTF-16 / UTF-32 / UCS-2

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

UCS-2 устарел: он больше не может представлять каждый символ Unicode. UTF-8, UTF-16 и UTF-32 могут. Но почему есть три разных способа кодирования одних и тех же символов?

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

  1. Эти строки состоят из 8-битных кодовых единиц.
  2. Этот 1 символ = 1 кодовая единица.

Проблема для многоязычного текста (или даже для одноязычного текста, если этот язык был китайским, японским или корейским) заключается в том, что эти два предположения вместе взятые ограничивают вас 256 символами. Если вам нужно представить больше, вам нужно отказаться от одного из предположений.

Сохранение предположения №1 и отказ от предположения №2 дает переменную ширину (или многобайтовую ) кодировку . Сегодня самой популярной кодировкой переменной ширины является UTF-8.

Отказ от предположения №1 и сохранение предположения №2 дает кодировку широких символов . Юникод и UCS-2 изначально были разработаны для использования 16-битной кодировки с фиксированной шириной, что позволяет использовать 65 536 символов. Ранние последователи Unicode, такие как Sun (для Java) и Microsoft (для NT), использовали UCS-2.

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

Но Sun и Microsoft написали огромные API-интерфейсы, основанные на 16-битных символах, и без особого энтузиазма переписывали их для 32-битных. К счастью, из исходной «базовой многоязычной плоскости», состоящей из 65 536 символов, все еще оставался блок из 2048 неназначенных символов, который можно было назначить как «суррогаты» для использования в парах для представления дополнительных символов: форма кодировки UTF-16. К сожалению, UTF-16 не соответствует ни из двух исходных предположений: он не является 8-битным и имеет переменную ширину.

Вкратце:

Используйте UTF-8, когда важно предположение о 8-битных единицах кода.

Это относится к:

  • Именам файлов и связанным с ними вызовам ОС в системах Unix, которые имеют устоявшуюся традицию разрешать кодирование переменной ширины, но не могут принимать '\ x00 байтов внутри строк и, следовательно, не может использовать UTF-16 или UTF-32. Фактически, UTF-8 был первоначально разработан для ОС на базе Unix (Plan 9).
  • Протоколы связи, разработанные для потоков октетов.
  • Все, что требует двоичной совместимости с US-ASCII, но не дает специальной обработки байтовым значениям выше 127.

Используйте UTF-32, когда важно допущение о кодировке с фиксированной шириной.

Это полезно, когда вы заботитесь о свойствах символов , а не об их кодировке, таких как эквиваленты Unicode для ctypes .h функции, такие как isalpha , isdigit , toupper и т. д.

Используйте UTF-16, когда ни одно из предположений не так важно, но используется ваша платформа использовать UCS-2.

Вы пишете для Windows или для платформы .NET, предназначенной для нее? Для Java? Тогда UTF-16 - ваш строковый тип по умолчанию; с таким же успехом можно использовать это.

Поскольку вы используете C #, все ваши строки будут закодированы в UTF-16. ASP.NET будет кодировать фактические HTML-страницы в UTF-8, но это делается за кулисами, и вам не о чем беспокоиться.

Соображения по размеру

Три формы кодирования UTF требуют разного объема памяти для представления символа:

  • Для символов от U + 0000 до U + 007F (ASCII) требуется 1 байт в UTF-8, 2 байта в UTF- 16 или 4 байта в UTF-32.
  • Для символов от U + 0080 до U + 07FF (символы IPA, греческий, кириллица, армянский, иврит, арабский, сирийский, Thaana, NKo) требуется 2 байта в UTF-8, 2 байта в UTF-16 или 4 байта в UTF-32.
  • Для символов от U + 0800 до U + FFFF (остальная часть BMP, в основном для азиатских языков) требуется 3 байта в UTF-8, 2 байта в UTF-16 или 4 байта в UTF-32.
  • Для символов от U + 10000 до U + 10FFFF требуется 4 байта во всех трех формах кодирования.

Таким образом, если вы хотите сэкономить место, используйте UTF-8, если ваши символы в основном ASCII, или UTF-16, если ваши символы в основном азиатские.

26
ответ дан 3 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

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