2

我一直在考虑一种让程序员写下所有 ASCII 字符的简单方法。首先,我尝试在控制台中打印它,但它没有显示所有字符。所以我试图将它写入一个首先工作但现在没有的文件。

代码 :

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream file;
    file.open("/home/david/Desktop/ascii.txt", ios_base::out);
    for(int i = 0; i <= 255; i++)
        file << char(i);
    file.close();
    return 0;
}

正常的 ASCII 表有 128 个,扩展表有 127 个。所以总共有 255 个字符。但不知何故,它不会将所有字符都保存到文件中。有时“gedit”甚至不识别编码标准。

我究竟做错了什么?

4

4 回答 4

5

并非每个 ASCII 字符实际上都是可打印的。例如,您希望如何显示“回车”或“航向开始”?这些字符可以由不同的编辑器/终端以不同的方式显示,或者根本不显示。目前尚不清楚您到底要做什么以及为什么,但如果您正在寻找一个 ASCII 表,这里有一个适合您:

       Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
       ------------------------------------------------------------------------
       000   0     00    NUL '\0'                    100   64    40    @
       001   1     01    SOH (start of heading)      101   65    41    A
       002   2     02    STX (start of text)         102   66    42    B
       003   3     03    ETX (end of text)           103   67    43    C
       004   4     04    EOT (end of transmission)   104   68    44    D
       005   5     05    ENQ (enquiry)               105   69    45    E
       006   6     06    ACK (acknowledge)           106   70    46    F
       007   7     07    BEL '\a' (bell)             107   71    47    G
       010   8     08    BS  '\b' (backspace)        110   72    48    H
       011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
       012   10    0A    LF  '\n' (new line)         112   74    4A    J
       013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
       014   12    0C    FF  '\f' (form feed)        114   76    4C    L
       015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
       016   14    0E    SO  (shift out)             116   78    4E    N
       017   15    0F    SI  (shift in)              117   79    4F    O
       020   16    10    DLE (data link escape)      120   80    50    P
       021   17    11    DC1 (device control 1)      121   81    51    Q
       022   18    12    DC2 (device control 2)      122   82    52    R
       023   19    13    DC3 (device control 3)      123   83    53    S
       024   20    14    DC4 (device control 4)      124   84    54    T
       025   21    15    NAK (negative ack.)         125   85    55    U
       026   22    16    SYN (synchronous idle)      126   86    56    V
       027   23    17    ETB (end of trans. blk)     127   87    57    W
       030   24    18    CAN (cancel)                130   88    58    X
       031   25    19    EM  (end of medium)         131   89    59    Y
       032   26    1A    SUB (substitute)            132   90    5A    Z
       033   27    1B    ESC (escape)                133   91    5B    [
       034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
       035   29    1D    GS  (group separator)       135   93    5D    ]
       036   30    1E    RS  (record separator)      136   94    5E    ^
       037   31    1F    US  (unit separator)        137   95    5F    _
       040   32    20    SPACE                       140   96    60    `
       041   33    21    !                           141   97    61    a
       042   34    22    "                           142   98    62    b
       043   35    23    #                           143   99    63    c
       044   36    24    $                           144   100   64    d
       045   37    25    %                           145   101   65    e
       046   38    26    &                           146   102   66    f
       047   39    27    '                           147   103   67    g
       050   40    28    (                           150   104   68    h
       051   41    29    )                           151   105   69    i
       052   42    2A    *                           152   106   6A    j
       053   43    2B    +                           153   107   6B    k
       054   44    2C    ,                           154   108   6C    l

       055   45    2D    -                           155   109   6D    m
       056   46    2E    .                           156   110   6E    n
       057   47    2F    /                           157   111   6F    o
       060   48    30    0                           160   112   70    p
       061   49    31    1                           161   113   71    q
       062   50    32    2                           162   114   72    r
       063   51    33    3                           163   115   73    s
       064   52    34    4                           164   116   74    t
       065   53    35    5                           165   117   75    u
       066   54    36    6                           166   118   76    v
       067   55    37    7                           167   119   77    w
       070   56    38    8                           170   120   78    x
       071   57    39    9                           171   121   79    y
       072   58    3A    :                           172   122   7A    z
       073   59    3B    ;                           173   123   7B    {
       074   60    3C    <                           174   124   7C    |
       075   61    3D    =                           175   125   7D    }
       076   62    3E    >                           176   126   7E    ~
       077   63    3F    ?                           177   127   7F    DEL

如果您正在寻找一种以二进制形式写入 ASCII 字符的方法,那么您需要通过std::ios_base::binary在打开模式下设置位来以二进制模式打开文件。

于 2013-05-31T20:20:10.590 回答
3

并非所有字符都是可打印的。您可以使用 isprint() 检查字符是否可打印;如果不是,您必须打印另一个(例如'.') char:
file << ((isprint(i))? char(i) : '.');

于 2013-05-31T20:29:31.360 回答
3

此代码将向您显示可打印的字符:

#include<iostream>
#include<iomanip>
#include<string>

int main() {
  std::cout<<std::setw(3)<<"dec "
           <<std::setw(3)<<"oct "
           <<std::setw(3)<<"hex "
           <<std::setw(3)<<"chr"
           <<std::endl;
  for(unsigned int id=0; id<255; id++) {
    char c = char(id);
    if(std::isprint(c)){
      std::cout<<std::dec<<std::setw(3)<<id<<" "
               <<std::oct<<std::setw(3)<<id<<" "
               <<std::hex<<std::setw(3)<<id<<" "
               <<std::setw(3)<<c<<std::endl;
    }
  }
  return 0;
}

输出:

dec oct hex chr
 32  40  20    
 33  41  21   !
 34  42  22   "
 35  43  23   #
 36  44  24   $
 37  45  25   %
 38  46  26   &
 39  47  27   '
 40  50  28   (
 41  51  29   )
 42  52  2a   *
 43  53  2b   +
 44  54  2c   ,
 45  55  2d   -
 46  56  2e   .
 47  57  2f   /
 48  60  30   0
 49  61  31   1
 50  62  32   2
 51  63  33   3
 52  64  34   4
 53  65  35   5
 54  66  36   6
 55  67  37   7
 56  70  38   8
 57  71  39   9
 58  72  3a   :
 59  73  3b   ;
 60  74  3c   <
 61  75  3d   =
 62  76  3e   >
 63  77  3f   ?
 64 100  40   @
 65 101  41   A
 66 102  42   B
 67 103  43   C
 68 104  44   D
 69 105  45   E
 70 106  46   F
 71 107  47   G
 72 110  48   H
 73 111  49   I
 74 112  4a   J
 75 113  4b   K
 76 114  4c   L
 77 115  4d   M
 78 116  4e   N
 79 117  4f   O
 80 120  50   P
 81 121  51   Q
 82 122  52   R
 83 123  53   S
 84 124  54   T
 85 125  55   U
 86 126  56   V
 87 127  57   W
 88 130  58   X
 89 131  59   Y
 90 132  5a   Z
 91 133  5b   [
 92 134  5c   \
 93 135  5d   ]
 94 136  5e   ^
 95 137  5f   _
 96 140  60   `
 97 141  61   a
 98 142  62   b
 99 143  63   c
100 144  64   d
101 145  65   e
102 146  66   f
103 147  67   g
104 150  68   h
105 151  69   i
106 152  6a   j
107 153  6b   k
108 154  6c   l
109 155  6d   m
110 156  6e   n
111 157  6f   o
112 160  70   p
113 161  71   q
114 162  72   r
115 163  73   s
116 164  74   t
117 165  75   u
118 166  76   v
119 167  77   w
120 170  78   x
121 171  79   y
122 172  7a   z
123 173  7b   {
124 174  7c   |
125 175  7d   }
126 176  7e   ~
于 2013-05-31T21:19:48.953 回答
2

有关参考,请参阅ASCII扩展 ASCII

RE:有时“gedit”甚至不识别编码标准。

我还强烈推荐每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值(没有借口!)

从上面的文章中,特别注意以下与您的问题相关的内容:

在 ANSI 标准中,每个人都同意在 128 以下做什么,这与 ASCII 几乎相同,但是有很多不同的方法可以处理 128 及以上的字符,具体取决于您居住的地方。这些不同的系统被称为代码页

因此,如何在应用程序中描绘从 128 到 255 的字符gedit完全取决于激活的代码页。也许它是这两个之一:

一些流行的英文文本编码是 Windows-1252(西欧语言的 Windows 9x 标准)和ISO-8859-1,又名 Latin-1(也适用于任何西欧语言)。

另外,请记住,大多数现代应用程序已经完全放弃了代码页,转而使用Unicode。Unicode 最常用的编码是UTF-8UTF-16。因此,也有可能gedit支持 Unicode。从上面的 ASCII 链接:

为了实现向后兼容性,为 128 个 ASCII 和 256 个 ISO-8859-1(拉丁 1)字符分配了与早期标准中的代码相同的 Unicode/UCS 代码点。因此,对于 Unicode/UCS 的一个非常小的子集,ASCII 可以被认为是 7 位编码方案,而 ASCII(以 0 作为第八位前缀时)是有效的 UTF-8。

于 2013-05-31T21:10:59.580 回答