您可以在一个字符中编码多少数据?

时间:2010-08-02 12:14:24

标签: string encoding character-encoding

如果我使用基于字符串的级别格式在AS3或.NET中创建视频游戏级别编辑器,可以复制,粘贴和通过电子邮件发送,我可以将多少数据编码到每个字符中?重要的是获取屏幕上显示的最小字符数量的最大数据量,而不管计算机实际用于存储这些字符的字节数。

例如,如果我想将对象的水平位置存储在1个字符串中,那么可能有多少个可能的值?是否有任何字符无法通过互联网发送,或者无法复制和粘贴?像UTF8这样的东西会有什么不同?请回答AS3或C#/。NET,或两者兼而有之。

第二次更新:确定所以Flash使用UTF16作为其String类。我有很多控制字符无法使用。我怎么能管理哪些字符可以使用?只是一个大的查找表?操作系统和浏览器是否可以处理UTF16,以便您可以安全地将UTF16字符串复制并粘贴到电子邮件,记事本等中?

4 个答案:

答案 0 :(得分:4)

已更新:“更新1”,“更新2”

您可以使用ANSI,ASCII或UTF-8编码将8位存储在单个字符中。

但是,例如,如果您想使用ASCII编码,则不应使用前5位(0001 1111 = 0x1F)和字符0x7F表示系统字符,例如“Escape,null,text of text” ,文本结束..)谁不能复制和粘贴。所以你可以在一个单一的charakter中存储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:

for Unicode(UTF-16)您可以使用此表:http://www.tamasoft.co.jp/en/general-info/unicode.html 任何字符代表一个符号,或者是空的,你不应该使用。 因此,如果您允许复制并通过它们,则无法在一个utf-16字符中存储50,000个可能的值。你需要任何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-Table http://www.asciitable.com/asciifull.gif ASCII-Table extended http://www.asciitable.com/extend.gif

答案 1 :(得分:2)

在C中,char是一种整数,最通常是一个字节宽。一个字节是8位,因此功率为8或256的可能值为2(如另一个答案中所述)。

在其他语言中,'character'与整数(应该是)完全不同,必须进行显式编码才能将其转换为字节。例如,Java通过在UTF-16编码内部存储字符(请原谅我的一些细节)使这相对简单,因此它们占用了16位,但这只是实现细节。不同的编码(如UTF-8)意味着一个字符在编码传输时可以占用1到4个字节的任何内容。

因此,你的问题是严重错误的(也就是说它实际上是几个不同的问题)。

一个字节可以有多少个值? 256。

电子邮件中可以发送哪些字符?主要是从空格(32)到波浪号(126)的那些ASCII字符。

可以通过互联网发送哪些字节?任何你喜欢的,只要你编码它们进行传输。

什么可以剪切和粘贴?如果你的平台可以做Unicode,那么所有的unicode;如果不是,不是。

UTF-8有所作为吗? UTF-8是一种将字符串编码为字符串的标准方法,可能与您的问题无关(Joel Spolsky有一个非常良好的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)帐户)

所以选择一个问题!

编辑,编辑后再提问啊哈!如果问题是:'如何以可以邮寄的方式对数据进行编码?',则答案可能是“使用base64”。也就是说,如果你的级别有一些纯二进制格式,那么base64是以一种通过邮件方式编码二进制blob的“标准”(非常引用标准)方式。你想谷歌的东西是'序列化'和'反序列化'。 Base64可能接近于每个可邮寄信息的实际最大值。

(另一个答案是“使用XML”,但问题似乎暗示了对紧凑性的一些偏好,并且基本上是二进制格式。)

答案 2 :(得分:2)

令人困惑的是,char与角色不同。在C和C ++中,char实际上总是8位类型。在Java和C#中,char是UTF-16代码单元,因此是16位类型。

但在Unicode中,字符由“代码”点表示,范围从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 reportoire)需要8位,U + 0080到U + 07FF需要16位,U + 0800到U + FFFF需要24位,而所有其他字符需要32位。
  

如果我正在制作视频游戏级别   基于字符串的级别的编辑器   格式,我可以编码多少数据   进入每个炭?例如,如果我   想存储水平   一个对象在1个字符中的位置,如何   可能有多种可能的价值?

由于你写了char而不是“character”,C的答案是256,C#的答案是65,536。

char并非设计为二进制数据类型。 <{1}}或byte会更合适。

  

是否有任何字符   无法通过互联网发送,或   无法复制和粘贴?

没有任何字符无法通过Internet发送,但您必须小心使用“控制字符”或非ASCII字符。

许多Internet协议(尤其是SMTP)是针对文本而非二进制数据而设计的。如果要发送二进制数据,可以Base64对其进行编码。这为消息的每个字节提供了6位信息。

答案 3 :(得分:1)

变量可以容纳的不同状态的数量是其所具有的位数的2的幂。变量有多少位可能会根据编译器和使用的机器而有所不同。但在大多数情况下,一个字符串将有八位,两个字符串的功率就是二百五十六个。

现代屏幕分辨率就是它们,你很可能需要不止一个字符来表示任何东西的水平位置。