代码之家  ›  专栏  ›  技术社区  ›  Iain

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

  •  0
  • Iain  · 技术社区  · 15 年前

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

    例如,如果我想用1个字符串字符存储一个对象的水平位置,它可以有多少个值?是否有任何字符无法通过Internet发送,或者无法复制和粘贴?像utf8这样的东西有什么区别?请回答AS3或C/.NET或两者。

    第二次更新:好的,所以flash的string类使用utf16。有很多控制字符我不能使用。如何管理哪些字符可以使用?只是一个大的查阅表格?操作系统和浏览器是否可以处理utf16,以便您能够安全地将utf16字符串复制并粘贴到电子邮件、记事本等中?

    4 回复  |  直到 13 年前
        1
  •  4
  •   Kieran Benton    13 年前

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

    您可以使用ANSI、ASCII或UTF-8编码在单个字符中存储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-工具,javascript基本网页,…)来修改值,您可以选择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 任何用类似或空符号表示的字符都不应使用。 因此,如果允许复制并通过一个utf-16字符,就不能在其中存储50000个可能的值。您需要任何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

        2
  •  2
  •   dan04    15 年前

    令人困惑地 char 与角色不同。在C和C++中,A 烧焦 实际上总是8位类型。在爪哇和C,A 烧焦 是一个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报告)需要8位,U+0080到U+07FF需要16位,U+0800到U+FFFF需要24位,所有其他字符需要32位。

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

    自从你写了 烧焦 答案不是“字符”,而是C的256和C的65536。

    但是 烧焦 不是设计为二进制数据类型。 byte short 会更合适。

    有没有人物 无法通过Internet发送,或 不能复制粘贴?

    没有任何字符不能通过互联网发送,但您必须小心使用“控制字符”或非ASCII字符。

    许多互联网协议(尤其是SMTP)是为文本而不是二进制数据而设计的。如果要发送二进制数据,可以 Base64 编码它。它为消息的每个字节提供6位信息。

        3
  •  2
  •   Norman Gray    15 年前

    在C,A char 是一种整数类型,通常为一个字节宽。一个字节是8位,所以这是2的幂8,或256,可能的值(如另一个答案所述)。

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

    因此,你的问题有点畸形(也就是说它实际上是一个问题中的几个不同的问题)。

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

    电子邮件中可以发送哪些字符?大部分是从空格(32)到颚化符(126)的ASCII字符。

    可以通过Internet发送哪些字节?任何你喜欢的,只要你为传输编码。

    什么可以剪切粘贴?如果您的平台可以使用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”,但这个问题似乎暗示了对紧凑性的某种偏好,基本上需要二进制格式)。

        4
  •  1
  •   Brian Hooper    15 年前

    一个变量可以保持的不同状态的数量是它所具有位数的两倍。一个变量有多少位可能会根据所使用的编译器和机器而变化。但在大多数情况下,一个字符有8位,2的幂为8的是256。

    现代的屏幕分辨率是什么,你很可能需要一个以上的字符水平位置的任何东西。