我一直在考虑让程序员写下所有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”甚至不能识别编码标准。
我做错了什么?
答案 0 :(得分:5)
并非每个ASCII字符实际上都是可打印的。例如,您如何期望显示“回车”或“开始标题”?这些字符可以由不同的编辑者/终端以不同方式显示,或者根本不显示。目前尚不清楚你究竟要做什么以及为什么,但如果你正在寻找一个ASCII表,here is one为你:
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
位来以二进制模式打开文件。
答案 1 :(得分:3)
并非所有字符都可打印。您可以使用isprint()来检查字符是否可打印;如果不是,你必须打印另一个(例如'。')字符:
档案&lt;&lt; ((isprint(i))?char(i):'。');
答案 2 :(得分: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 ~
答案 3 :(得分:2)
如需参考,请参阅ASCII和Extended ASCII。
RE:有时候“gedit”甚至无法识别编码标准。
从上面的文章中,特别注意以下与您的问题相关的内容:
在ANSI标准中,每个人都同意在128以下做什么,哪个 与ASCII几乎相同,但有很多不同 处理128和以上字符的方法,具体取决于哪里 你住了这些不同的系统称为code pages。
那么,在gedit
这样的应用程序中如何描绘128到255之间的字符完全取决于活动的代码页。也许这是这两个中的一个:
一些流行的英文文本编码是Windows-1252(Windows 西欧语言的9x标准)和ISO-8859-1,又名 Latin-1(对任何西欧语言也很有用)。
此外,请记住,大多数现代应用程序已完全脱离代码页而转而使用Unicode。最常用的Unicode编码是UTF-8和UTF-16。因此,gedit
也可能支持Unicode。从上面的ASCII链接:
为了允许向后兼容,128 ASCII和256 ISO-8859-1 (Latin 1)字符被分配了Unicode / UCS代码点 与早期标准中的代码相同。因此,ASCII可以 被认为是一个非常小的子集的7位编码方案 Unicode / UCS和ASCII(当前缀为0作为第8位时)是 有效的UTF-8。