Сколько данных вы можете закодировать в один символ? - PullRequest
0 голосов
/ 02 августа 2010

Если бы я создавал редактор уровня видеоигры в AS3 или .NET со строковым форматом уровня, который можно скопировать, вставить и отправить по электронной почте, сколько данных я мог бы закодировать в каждый символ? Важно получить максимальный объем данных для минимального количества символов, отображаемых на экране, независимо от того, сколько байтов фактически используется компьютером для хранения этих символов.

Например, если я хочу сохранить горизонтальную позицию объекта в 1 строковом символе, сколько возможных значений это может иметь? Существуют ли какие-либо символы, которые нельзя отправить через Интернет, или которые нельзя скопировать и вставить? Какую разницу будут иметь такие вещи, как UTF8? Ответы, пожалуйста, для AS3 или C # / .NET, или для обоих.

2-е обновление: хорошо, так что Flash использует UTF16 для своего класса String. Есть много управляющих символов, которые я не могу использовать. Как я могу определить, какие символы можно использовать? Просто большой справочный стол? И могут ли операционные системы и браузер обрабатывать UTF16 в такой степени, чтобы вы могли безопасно копировать и вставлять строку UTF16 в электронное письмо, блокнот и т. Д.?

Ответы [ 4 ]

4 голосов
/ 02 августа 2010

Обновлено: «обновление 1», «обновление 2»

Вы можете хранить 8 бит в одном символе с кодировкой ANSI, ASCII или UTF-8.

Но, например, если вы хотите использовать ASCII-кодирование, вы не должны использовать первые 5 битов (0001 1111 = 0x1F), а символы 0x7F представляют системные символы, такие как «Escape, null, начало текста». , конец текста ..), которые не могут быть скопированы и вставлены. Таким образом, вы можете хранить 223 (1110 0000 = 0xE0) различной информации в одном символе.

Если вы используете UTF-16, у вас есть 2 байта = 16 бит - системные символы для хранения вашей информации.

A in UTF-8 Encoding: 0x0041 (the first 2 digits are every 0!) or 0x41
A in UTF-16 Encoding: 0x0041 (the first 2 digits can be higher then 0) 
A in ASCII Encoding: 0x41 
A in ANSI Encoding: 0x41

см. Изображения на этом посте!

обновление 1:

Если вам не нужно изменять значения без какого-либо инструмента (c # -tool, веб-страница javascript-base, ...), вы можете использовать base64 или zip + base64 для ваших информационных пользователей. Это решение позволяет избежать проблемы, описанной вами во втором обновлении. «Здесь много контрольных символов, которые я не могу использовать. Как я могу определить, какие символы можно использовать?»

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

var illegalCharCodes = new byte[]{0x00, 0x01, 0x02, ..., 0x1f, 0x7f};

или вы пишете это так:

//The example based on ASNI-Encoding but in principle its the same with utf-16
var value = 0;
if(charcode > 0x7f)
  value = charcode - 0x1f - 1; //-1 because 0x7f is the first illegalCharCode higher then 0x1f
else
  value = charcode - 0x1f;
value -= 1; //because you need a 0 value;
//charcode: 0x20 (' ') -> value: 0
//charcode: 0x21 ('!') -> value: 1
//charcode: 0x22 ('"') -> value: 2
//charcode: 0x7e ('~') -> value: 94
//charcode: 0x80 ('€') -> value: 95
//charcode: 0x81 ('�') -> value: 96
//..

обновление 2:

для Unicode (UTF-16) вы можете использовать эту таблицу: http://www.tamasoft.co.jp/en/general-info/unicode.html Любой символ, обозначенный как или пустой, не должен использоваться. Таким образом, вы не можете хранить 50000 возможных значений в одном символе utf-16, если вы разрешаете копировать и вставлять их. вам нужен любой spezial-кодировщик, и вы должны использовать 2 символа UTF-16, например:

//charcode: 0x0020 + 0x0020 ('  ') > value: 0
//charcode: 0x0020 + 0x0020 (' !') > value: 2
//charcode: 0x0020 + 0x0020 ('!A') > value: something higher 40.000, i dont know excatly because i dont have count the illegal characters in UTF-16 :D

ASCII-таблица http://www.asciitable.com/asciifull.gif ASCII-таблица расширенная http://www.asciitable.com/extend.gif

2 голосов
/ 02 августа 2010

Запутанно, char - это не то же самое, что персонаж. В C и C ++ char практически всегда является 8-битным типом. В Java и C # char - это кодовая единица UTF-16 и, следовательно, 16-битный тип.

Но в Юникоде символ представлен точкой «кода» в диапазоне от 0 до 0x10FFFF, для которой 16-битный тип не подходит. Таким образом, символ должен быть представлен 21-битным типом (на практике 32-битным типом) или использовать несколько «кодовых единиц». В частности,

  • В UTF-32 для всех символов требуется 32 бита.
  • В UTF-16 символы от U + 0000 до U + FFFF («базовая многоязычная плоскость»), кроме U + D800 - U + DFFF, которые не могут быть представлены, требуют 16 бит, а все другие символы требуют 32 бит .
  • В UTF-8 символам от U + 0000 до U + 007F (репортуар ASCII) требуется 8 битов, от U + 0080 до U + 07FF требуется 16 битов, от U + 0800 до U + FFFF требуется 24 бита, а все остальные для символов требуется 32 бита.

Если бы я создавал уровень видеоигры редактор со строковым уровнем формат, сколько данных я могу закодировать в каждый символ? Например, если я хотел хранить горизонтальный положение объекта в 1 символе, как много возможных значений это может иметь?

Поскольку вы написали char, а не «символ», ответ будет 256 для C и 65,536 для C #.

Но char не предназначен для двоичного типа данных. byte или short будет более подходящим.

Есть ли персонажи, которые не может быть отправлено через Интернет, или что нельзя скопировать и вставить?

Нет никаких символов, которые нельзя отправить через Интернет, но вы должны быть осторожны, используя «управляющие символы» или не-ASCII символы.

Многие интернет-протоколы (особенно SMTP) предназначены для текстовых, а не двоичных данных. Если вы хотите отправить двоичные данные, вы можете Base64 кодировать их. Это дает вам 6 бит информации для каждого байта сообщения.

2 голосов
/ 02 августа 2010

В C char - это тип целого числа, и обычно он составляет один байт.Один байт равен 8 битам, так что это 2 к степени 8, или 256, возможных значений (как отмечено в другом ответе).

В других языках «символ» - это совершенно другое, чем целое число (какэто должно быть), и должно быть явно закодировано, чтобы превратить его в байт.Java, например, делает это относительно простым, храня символы внутри в кодировке UTF-16 (простите мне некоторые детали), поэтому они занимают 16 бит, но это только детали реализации.Различные кодировки, такие как UTF-8, означают, что символ, при кодировании для передачи, может занимать что угодно от одного до четырех байтов.

Таким образом, ваш вопрос слегка искажен (то есть фактически это несколько отдельных вопросов в одном).

Сколько значений может иметь байт?256.

Какие символы можно отправлять в письмах?В основном это символы ASCII от пробела (32) до тильды (126).

Какие байты можно отправлять через Интернет?Любое, что вам нравится, если вы кодируете их для передачи.

Что можно вырезать и вставить?Если ваша платформа может делать Unicode, то все из Unicode;если нет, то нет.

Имеет ли значение UTF-8?UTF-8 является стандартным способом кодирования строки символов в строку байтов, и, вероятно, не имеет ничего общего с вашим вопросом (Джоэль Спольски имеет очень хороший счет Абсолютный минимум каждыйРазработчик программного обеспечения, безусловно, должен знать о юникоде и наборах символов (без извинений!) ).

Так что выбирайте вопрос!

Редактируйте, следуя за редактированием вопроса 1025* Ага!Если вопрос звучит так: «Как мне закодировать данные таким образом, чтобы их можно было отправлять по почте?», Тогда ответ, вероятно, «Использовать base64 ».То есть, если у вас есть какой-то чисто двоичный формат для ваших уровней, то base64 является «стандартным» (очень стандартным для кавычек) способом кодирования этого двоичного двоичного объекта таким образом, чтобы он передавался по почте.То, что вы хотите найти в Google, это «сериализация» и «десериализация».Base64, вероятно, близок к практическому максимуму информации на один почтовый символ.

(Другой ответ - «использовать XML», но вопрос, похоже, подразумевает некоторое предпочтение компактности, и что в основном двоичный форматжелательно).

1 голос
/ 02 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...