Как определить «самую низкую» кодировку? - PullRequest
3 голосов
/ 17 сентября 2010

Сценарий

У вас есть много файлов XML, хранящихся в формате UTF-16 в базе данных или на сервере, где пространство не является проблемой. Вам нужно взять большую часть этих файлов, которые вам нужны для передачи в другие системы, в виде файлов XML, и очень важно, чтобы вы использовали как можно меньше места.

Выпуск

В действительности только около 10% файлов, хранящихся в формате UTF-16, должны храниться в формате UTF-16, остальные могут безопасно храниться в формате UTF-8 и все будет в порядке. Если у нас могут быть те, которые должны быть UTF-16, а остальные UTF-8, мы можем использовать примерно на 40% меньше места в файловой системе.

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

Цель

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

Некоторые подробности о XML-файле и данных

Хотя мы контролируем схему для самого XML, мы не контролируем, какой тип «строк» ​​может входить в значения с точки зрения Unicode, поскольку источник может предоставить данные Unicode для использования. Однако это редко, поэтому мы не хотели бы использовать UTF-16 каждый раз только для поддержки чего-то, что требуется только в 10% случаев.

Среда разработки

Мы используем C # с .Net Framework 4.0.

РЕДАКТИРОВАТЬ: Решение

Решением является просто использование UTF-8.

Вопрос был основан на моем неправильном понимании UTF, и я благодарен всем, кто помог мне разобраться. Спасибо!

Ответы [ 5 ]

7 голосов
/ 17 сентября 2010

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


Я бы сказал, что даже менее 10% файлов нужно хранить как UTF-16. Даже если ваш XML содержит значительное количество китайского, японского, корейского или другого языка, который больше в UTF-8, чем в UTF-16, это все равно будет проблемой, только если на этом языке больше текста, чем синтаксиса XML.

Поэтому моя первоначальная интуиция - «использовать UTF-8 до тех пор, пока это не станет проблемой». Это также обеспечивает последовательность.

Если у вас есть серьезные основания полагать, что значительная часть XML будет восточноазиатской, то вам нужно беспокоиться об этом. В этом случае я бы применил простую эвристику, например ... пройтись по XML и посчитать количество символов, превышающее U + 0800 (это три байта в UTF-8), и только если это больше, чем число символы меньше U + 0080 (это один байт в UTF-8), используйте UTF-16.

6 голосов
/ 17 сентября 2010

Кодировать все в UTF-8.UTF-8 может обрабатывать все, что может UTF-16, и почти наверняка будет меньше в случае XML-документа.Единственный случай, когда UTF-8 будет больше, чем UTF-16, будет, если файл будет в основном состоять из символов за пределами BMP, и в лучшем случае (ASCII-спецификация, которая включает каждый символ, который вы можете набрать на стандартном US104 ключа) файл UTF-8 будет в два раза меньше UTF-16.

UTF-8 требует 2 байта или меньше на символ для всех символов с порядковым номером U07FF или ниже, и один байт для любогосимвол в расширенной кодовой странице ASCII;это означает, что размер UTF-8 будет по крайней мере равен размеру UTF-16 (и, возможно, намного меньше) для любого документа на современном языке, использующего латинский, греческий, кириллический, ивритский или арабский алфавиты, включая большинство общих символовиспользуется в алгебре и МФА.Он называется базовой многоязычной плоскостью и охватывает более 90% всех официальных национальных языков за пределами Азии.

UTF-16, как правило, даст вам файл меньшего размера для документов, написанных преимущественно наДеванагари (хинди), японский, китайский или хангул (корейский) алфавиты, или любой древний или «эзотерический» алфавит (чероки или инуиты?), И МОЖЕТ быть меньше в случае документов, которые интенсивно используют специализированные математические, научные, инженерные илиигровые символы.Если XML, с которым вы работаете, предназначен для файлов локализации для Индии, Китая и Японии, вы МОЖЕТЕ получить меньший размер файла с UTF-16, но вам придется сделать свою программу достаточно умной, чтобы знать, что файл локализации закодирован таким образом..

5 голосов
/ 17 сентября 2010

Вам никогда не «нужно» использовать UTF-16 вместо UTF-8, и выбор не в «безопасности».Обе кодировки имеют одинаковый кодируемый репертуар символов.

4 голосов
/ 17 сентября 2010

Нет такой вещи, как документ, должен быть UTF-16 . Любой документ UTF-16 также может быть закодирован как UTF-8. Теоретически возможно иметь документ, который больше как UTF-8, чем как UTF-16, но это невероятно маловероятно и подчеркивать не стоит.

Просто закодируйте все как UTF-8 и перестаньте беспокоиться об этом.

1 голос
/ 17 сентября 2010

Нет символов, требующих UTF-16, а не UTF-8. Как UTF-8, так и UTF-16 (и в этом отношении UTF-32 вместе с некоторыми другими нерекомендованными форматами) могут кодировать всю UCS (именно это означает UTF).

Есть несколько потоков, которые будут меньше в UTF-16, чем в UTF-8. Однако на практике такие потоки будут в основном содержать азиатские иероглифы, которые являются лингвистически очень краткими. Однако XML требует некоторых символов в диапазоне 0x20-0x7F с определенными значениями и довольно часто использует алфавитные сценарии для имен элементов и атрибутов.

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

Как правило, используйте UTF-8 для передачи и хранения.

Редактировать: Просто заметил, что вы тоже сжимаете. В этом случае баланс еще менее важен, просто используйте UTF-8 и покончите с этим.

...