如果我使用基于字符串的级别格式在AS3或.NET中创建视频游戏级别编辑器,可以复制,粘贴和通过电子邮件发送,我可以将多少数据编码到每个字符中?重要的是获取屏幕上显示的最小字符数量的最大数据量,而不管计算机实际用于存储这些字符的字节数。
例如,如果我想将对象的水平位置存储在1个字符串中,那么可能有多少个可能的值?是否有任何字符无法通过互联网发送,或者无法复制和粘贴?像UTF8这样的东西会有什么不同?请回答AS3或C#/。NET,或两者兼而有之。
第二次更新:确定所以Flash使用UTF16作为其String类。我有很多控制字符无法使用。我怎么能管理哪些字符可以使用?只是一个大的查找表?操作系统和浏览器是否可以处理UTF16,以便您可以安全地将UTF16字符串复制并粘贴到电子邮件,记事本等中?
答案 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位类型)表示,或者使用多个“代码单元”。具体地,
如果我正在制作视频游戏级别 基于字符串的级别的编辑器 格式,我可以编码多少数据 进入每个炭?例如,如果我 想存储水平 一个对象在1个字符中的位置,如何 可能有多种可能的价值?
由于你写了char
而不是“character”,C的答案是256,C#的答案是65,536。
但char
并非设计为二进制数据类型。 <{1}}或byte
会更合适。
是否有任何字符 无法通过互联网发送,或 无法复制和粘贴?
没有任何字符无法通过Internet发送,但您必须小心使用“控制字符”或非ASCII字符。
许多Internet协议(尤其是SMTP)是针对文本而非二进制数据而设计的。如果要发送二进制数据,可以Base64对其进行编码。这为消息的每个字节提供了6位信息。
答案 3 :(得分:1)
变量可以容纳的不同状态的数量是其所具有的位数的2的幂。变量有多少位可能会根据编译器和使用的机器而有所不同。但在大多数情况下,一个字符串将有八位,两个字符串的功率就是二百五十六个。
现代屏幕分辨率就是它们,你很可能需要不止一个字符来表示任何东西的水平位置。