【问题标题】:What does 256 means for 128 unique characters in ascii table256对于ascii表中的128个唯一字符意味着什么
【发布时间】:2015-02-25 01:33:27
【问题描述】:

如果我需要检查一个字符串是否有唯一字符,我知道如果我们正在考虑 Ascii 表中的字符,那么其中会有 128 个。

但是,为什么我们需要创建一个大小为 256 的布尔数组来容纳 128 个字符来检查字符串中是否至少存在一次元素?大小为 128 的布尔数组不应该足够吗?

这是《Cracking the Coding Interview》一书中的一段话:

if (str.length() > 128) return false;
boolean[] char_set = new boolean[256]; //which is strange since it clearly says over 128 its false

.....

【问题讨论】:

  • 谁说你“需要创建一个大小为 256”的布尔数组
  • @VáclavZeman 说了什么。我会注意到,尽管传统的 8 位字符集通常被错误地称为“ASCII”,所以说这句话的人(老师?)也许受到了它的影响。
  • 这是破解编码面试的解决方案:if (str.length() > 28) return false; boolean[] char_set = new boolean[256];这就是建议的解决方案。
  • 现在更新为“new boolean[128]”。 github.com/careercup/ctci/blob/master/java/Chapter%201/…

标签: ascii


【解决方案1】:

基本上,我们只使用了 128 个字符,这些字符主要在程序中使用。 但 ASCII 表中的字符总数为 256(0 到 255)。 0 到 31(共 32 个字符)称为 ASCII 控制字符(字符代码 0-31)。 32 到 127 个字符被称为 ASCII 可打印字符(字符代码 32-127)。 128到255被称为扩展ASCII码(字符码128-255)。

查看参考:http://www.ascii-code.com/

QWERTY (ENGLISH) 键盘中不存在大多数扩展的 ASCII 字符,所以这就是原因,作者在“Cracking the coding interview”一书中的那个例子中总共使用了 128 个字符。

【讨论】:

    【解决方案2】:

    不,有 256 个 ASCII 字符。这包括标准 ASCII 字符(0-127)和扩展 ASCII 字符(128-255)。

    更多信息。请参阅: http://www.flexcomm.com/library/ASCII256.htm

    【讨论】:

    • "扩展 ASCII" 不是 ASCII;它也不是一个字符集。通常,如此描述的字符集具有单字节编码。但是,并非所有字符都有 256 个字符(例如 Windows-1252)。在 Windows 编程中,此类字符集称为 ANSI。无论您如何称呼它们,知道使用的是哪一个通常至关重要,因此最好避免使用“扩展 ASCII”一词。
    • 1981 年,IBM 开发了一种 8 位 ASCII 代码的扩展,称为“代码页 437”,在此版本中将一些过时的控制字符替换为图形字符。还添加了 128 个字符,包括新的符号、符号、图形和拉丁字母,以及用其他语言(如西班牙语)书写文本所需的所有标点符号和字符。以这种方式添加了从 128 到 255 的 ASCII 字符。theasciicode.com.ar/extended-ascii-code/…
    • DED LINK :( 可能添加存档
    【解决方案3】:

    如今,许多人草率地使用术语“ASCII”来描述 ISO-8859-1 (also known as Latin-1),这是一个字符集,其中包括老式 ASCII 字符集中的 [32 .. 126] 个可打印字符值,以及也是 [128..255] 范围内的值。 Latin-1 在覆盖西欧语言方面做得相当不错,而 ASCII 仅限于基本英语中使用的非重音字符。

    ASCII 还包括 [0-31] 和 127 范围内的控制字符。这些不代表可打印字符(尽管 unicode 在这些位置提供字符)。它们是return、linefeed、tab、ctrl-c、formfeed等。其中一些是过去电传打字机和电传机的遗留物。

    请注意纸带在每一帧中有八个位位置。这些是 ASCII / Latin-1 的位。 “删除”又名 Rubout 是 127 或 0111 1111。为什么?因为可以在胶带上打出所有七个孔,然后擦掉一个字符。

    这可能解释了有人建议使用 256 位数组以这种字符集对文本进行制表。

    【讨论】:

    • ASCII的范围是0..127;它包括控制字符。
    • 这开始很好,但后来不知何故失去了轨道。关于穿孔胶带的转移充其量是切题的,最后一段是如何从你上面所说的事情中得出的?
    【解决方案4】:

    我认为在同一功能中使用 128 和 256 是该书版本的错误。在较新的第 6 版(2016 年)中,代码示例指出:

    if (str.length() > 128) return false;
    boolean[] char_set = new boolean[128];
    

    作者添加评论:

    假设 256 个字符是可以的。这将是扩展 ASCII 的情况。

    因此,对于这本书的练习,请使用任一 128 256,而不是两者。

    【讨论】:

      【解决方案5】:

      作者可能混淆了字符和字节。你也应该了解编码的相关概念。

      一个字节是八位。传统上通常使用一个字节来存储一个字符,尽管非常早期的计算机只需要 7 位来存储一个字符。用于将字符编码为 7 位的 ASCII standard 于 1963 年获得批准,尽管当时也存在相互竞争的字符编码(其中 EBCDIC 至今仍然存在)。

      当您只使用可用的 8 位中的 7 位时,您可能会对如何处理备用位有所了解。一种常见的方法是对 ASCII 标准中不可用的其他非标准字符进行编码。已经定义了大量传统的 8 位编码,其中一些也已作为标准发布。有些仍在流行;一些例子是ISO-8859-1(又名Latin-1)和Windows代码页(4378501252在西方国家仍然普遍使用,尽管它们有很多缺点)。其中许多是“扩展 ASCII”编码,前 128 个字符与 ASCII 兼容;尽管术语“扩展 ASCII”在技术上并没有真正明确定义。

      如果您正在处理字节序列,您确实希望能够处理 0-255 范围内的字节值,而不仅仅是 ASCII 中定义的字节值。另一方面,如果您保证您要处理的所有字节的值都不会超过 127(例如,如果您的输入已知为 ASCII,因为它来自无法生成的源其他任何东西),为您知道自己不需要的值保留空间是过分的。

      展望未来,大多数现代系统都以一种或另一种形式使用 Unicode。在 Windows 上,显然还在 Java 中,你应该期待UTF-16;在其他地方,UTF-8 正在迅速成为事实上的标准。这两者都要求您的代码能够干净地处理 8 位字节,尽管代码点不是(必然地,在 UTF-8 中,或者永远在 UTF-16 中)以单个字节编码。

      至于您发布的代码,如果您丢弃任何值大于 127 的字节,那么 128 个字符位置就足够了。另一方面,根据您希望处理的数据,丢弃非 ASCII 字符可能根本不是正确的做法;然后,如果你不丢弃任何东西,你确实需要处理所有 256 个。

      无论哪种方式,如果只丢弃大于 128 的值,则需要数组中的 129 个位置(0 到 128 范围内有 129 个整数)。这可能只是一个愚蠢的错误。

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 1970-01-01
        • 2016-04-06
        • 2013-06-22
        • 2015-07-30
        • 2018-04-21
        • 2023-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多