鱼C论坛

 找回密码
 立即注册
查看: 15500|回复: 20

char类型数据输出为乱码。。求大神指点- -。。。

[复制链接]
发表于 2013-7-31 14:49:12 | 显示全部楼层 |阅读模式
3鱼币
问题背景如下:
定义char a=219;
想输出对应的字符,结果编译后输入为乱码(编译器为VC++6.0)。。。
000.png

源代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <conio.h>
  5. #include <windows.h>
  6. void main ()
  7. {
  8. unsigned char a, b;
  9. a = 176;
  10. b = 219;
  11. system("color 0a");

  12. printf ("%u%u%u%u%u\n",b,a,a,a,b);
  13. printf ("%c%c%c%c%c\n",a,b,a,b,a);
  14. printf ("%c%c%c%c%c\n",a,a,b,a,a);
  15. printf ("%c%c%c%c%c\n",a,b,a,b,a);
  16. printf ("%c%c%c%c%c\n",b,a,a,a,b);
  17. printf ("%c\n",b);
  18. getch();
  19. return 0;

  20. }
复制代码

求各位大神指点- -!
不胜感激~


最佳答案

查看完整内容

ASCII码字符表 和扩展的ASCII码: 其实大家都知道计算机是老美发明的,当初人家并没有考虑后来需要增加那么多字符,比如中国的汉字,那么早期的美国常用字符,用1个字节的前7个位来表示,已经足够了,这样就产生了ASCII码,后来就不够用了,第8位也被扩展使用了,就增加了一些字符,这也就多了扩展的ASCII码。 lz问题是由于计算机操作系统的默认字符集对应不上导致的。 诚如hlfly所说——中文环境下,文字,即“字(两个字节) ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 14:49:13 | 显示全部楼层
ASCII码字符表 和扩展的ASCII码:
其实大家都知道计算机是老美发明的,当初人家并没有考虑后来需要增加那么多字符,比如中国的汉字,那么早期的美国常用字符,用1个字节的前7个位来表示,已经足够了,这样就产生了ASCII码,后来就不够用了,第8位也被扩展使用了,就增加了一些字符,这也就多了扩展的ASCII码。

lz问题是由于计算机操作系统的默认字符集对应不上导致的。
诚如hlfly所说——中文环境下,文字,即“字(两个字节)”容易被2个字节的扩展符所模糊化。
所以将系统的默认语言改回老美的,就可以看得到正确的扩展字符了。

个人认为正确的来说:
要看具体的显示环境,是终端窗口还是TextOut绘画在DC上的。
方法1:如lz之前的方式,改变系统默认字符集。
方法2:_tsetlocale(LC_ALL, _T("chs")); 可能也有关系,可以尝试一下。
ps:至于_tsetlocale是我在写Unicode程序时用到的一个函数,它是设置unicode和宽字符之间的转换代码表的,估计对楼主的程序没什么作用。
举例说明一下,unicode的程序读取常见的GB2313编码的文件内容,如果不用tsetlocale设置一下,读取到的就是乱码,因为在翻译成unicode时,
默认是用 英语->Unicode 的方式翻译的。
总之,_tsetlocale作为了解看一下,对楼主的项目是没有帮助的。
  

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 15:06:24 | 显示全部楼层
应该是176和219没有对应的字符吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 15:49:54 | 显示全部楼层
应该是176和219没有对应的字符吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 17:26:48 | 显示全部楼层
本帖最后由 style?b? 于 2013-7-31 17:32 编辑

有符号字符变量取值范围 -128~127,%c输出是越界了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 22:57:44 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main()
  4. {
  5.         unsigned char a,b;
  6.         a=176;
  7.         b=219;
  8.         system("color 0a");
  9.         printf("%u%u%u%u%u\n",b,a,a,a,b);
  10.         printf("%c %c %c %c %c\n",a,b,a,b,a);
  11.         printf("%c%c%c%c%c\n",a,b,a,b,a);
  12.         printf("%c%c%c%c%c\n",b,a,a,a,b);
  13.         printf("%c\n",b);
  14.         return 0;
  15. }
复制代码
我猜你问题应该是为什么printf("%c\n",b);显示b的字符形式是一个'?'而在上面却出现不是'?'的情况
经过我稍微修改的程序(我把第二个printf这边加了几个空格)
11.jpg
可以看到加几个空格就正常是'?'了
至于下面
佰佰
怎么出现的
首先转换下进制
a=176=0xB0
b=219=0xDB
然后printf("%c%c%c%c%c\n",a,b,a,b,a);
把a,b,a,b,a按顺序输入字符串转换工具中
2.jpg
可以发现当连在一起时就是
佰佰
也就是说printf认为它们是连在一起的了
所以建议+空格让它好区分



评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
编程难 + 1 + 1 + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 23:22:55 | 显示全部楼层
前128个字符才是可用的~~这是100道经典例题里面的吧~ 超出了~这个题可能很久以前的了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-2 21:56:26 | 显示全部楼层
超过了128之后,计算机自动把它认为是多位元的字符,字符采用GBK编码方式
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-4 05:47:45 | 显示全部楼层
char 的无符号最大值是多少?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-4 15:02:48 | 显示全部楼层

单字节char 就是0-255嘛,有符号就是-128~127

在ASCII码中,128以上值是用于“扩展ASCII”,比如显示法文字符。欧美语言是1个字节就可以显示常用的文字。
但在欧美语言体系外的语言中(如中、日、韩文),是用2个字节来显示文字,每个单字节部分恰好也是用了128以上数值,如果界面的展示方法是用ASCII码,就显示为“扩展ASCII”,在中文语境下,就会和旁边的另一个字节合起来显示为中文字符。

这也解释了为什么有时我们的汉字会显示为奇怪的字符的问题,比如“激”=BCA4,有时会显示为188、164两个ASCII码对应的字符
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-4 21:23:50 | 显示全部楼层
学习了啊。。。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 22:45:27 | 显示全部楼层
1249333788 发表于 2013-7-31 15:06
应该是176和219没有对应的字符吧

有的- -~
在扩展码中~

ps:抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 22:47:42 | 显示全部楼层
style?b? 发表于 2013-7-31 17:26
有符号字符变量取值范围 -128~127,%c输出是越界了吧

lz定义的是无符号类型的哦~
Char 类型数据为一个字节,有符号的话,其对应的数值范围为-127~128
                                                   无符号类型的话,其对应的数值范围为0~255
Ps抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 22:49:20 | 显示全部楼层
游健健jee 发表于 2013-7-31 23:22
前128个字符才是可用的~~这是100道经典例题里面的吧~ 超出了~这个题可能很久以前的了

lz定义的是无符号类型的,所以没超出的哦~
Char 类型数据为一个字节,有符号的话,其对应的数值范围为-127~128
                                                   无符号类型的话,其对应的数值范围为0~255
Ps抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 22:51:05 | 显示全部楼层
565123 发表于 2013-8-2 21:56
超过了128之后,计算机自动把它认为是多位元的字符,字符采用GBK编码方式

这个要看你计算机系统上语言的定义,因为一般默认的是中文,所以128以后的对应的扩展码会显示不出来- -。。。。
ps:抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 22:51:53 | 显示全部楼层
喜欢散步 发表于 2013-8-4 05:47
char 的无符号最大值是多少?

无符号的话,0~255哦~
ps:抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 23:08:44 | 显示全部楼层
hlfly 发表于 2013-8-4 15:02
单字节char 就是0-255嘛,有符号就是-128~127

在ASCII码中,128以上值是用于“扩展ASCII”,比如显示 ...

大神解释的很精彩,赞一个~

Ps抱歉,lz上班忙了一个星期,回复迟了。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-8 23:25:18 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-7-31 22:57
我猜你问题应该是为什么printf("%c\n",b);显示b的字符形式是一个'?'而在上面却出现不是'?'的情 ...

非常感谢鱼友细致而耐心的解释~
lz很高兴~
不过非常惭愧的是,lz的意思没有表达清楚,其实lz想问的是——
无符号的char字符中,176和219有对应的ascii码(扩展码),为什么编译时乱码- -?

后来经同学帮忙查证后,发现一个非常有说服力的说法,lz亲自“以身试法”,发现行的通哦~,176和219对应的ascii码(扩展码)输出出来了哦- -~

首先普及一下扩展码:
扩展的 ASCII 打印字符表
十进制
字符
十进制
字符
128
&Ccedil;
192
129
ü
193
130
é
194
131
&acirc;
195
132
&auml;
196
133
à
197
134
&aring;
198
135
&ccedil;
199
136
ê
200
137
&euml;
201
138
è
202
139
&iuml;
203
140
&icirc;
204
141
ì
205
142
&Auml;
206
143
&Aring;
207
144
&Eacute;
208
145
&aelig;
209
146
&AElig;
210
147
&ocirc;
211
148
&ouml;
212
&Ocirc;
149
ò
213
150
&ucirc;
214
151
ù
215
152
&yuml;
216
153
&Ouml;
217
154
&Uuml;
218
155
&cent;
219
156
&pound;
220
157
&yen;
221
158
&#8359;
222
&#9616;
159
&#402;
223
&#9600;
160
á
224
α
161
í
225
&szlig;
162
ó
226
Γ
163
ú
227
π
164
&ntilde;
228
Σ
165
&Ntilde;
229
σ
166
&ordf;
230
&micro;
167
&ordm;
231
τ
168
&iquest;
232
Φ
169
&#8976;
233
Θ
170
&not;
234
Ω
171
&frac12;
235
δ
172
&frac14;
236
173
&iexcl;
237
φ
174
&laquo;
238
ε
175
&raquo;
239
176
&#9617;
240
177
&#9618;
241
±
178
242
179
243
180
244
&#8992;
181
245
&#8993;
182
246
÷
183
247
184
248
185
249
&#8729;
186
250
·
187
251
188
252
&#8319;
189
253
&sup2;
190
254
191
255



其中——
176
&#9617;


219


下面就是验证的方法了~
修正操作系统默认的字符集:
控制面板->区域和语言选项->高级->Unicode程序的语言  修改成英语(美国)
然后重新启动。

附上验证用的编译后的结果——




char 扩展码输出.JPG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-8-9 00:16:18 | 显示全部楼层
睿之火影 发表于 2013-8-8 23:25
非常感谢鱼友细致而耐心的解释~
lz很高兴~
不过非常惭愧的是,lz的意思没有表达清楚,其实lz想问的是— ...

这么给力!我都不知道还有修改系统语言这招,知识困乏。学到了haha~
误解了你的意思真不好意思。。@_@
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-9 00:21:23 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-8-9 00:16
这么给力!我都不知道还有修改系统语言这招,知识困乏。学到了haha~
误解了你的意思真不好意思。。@_@

共勉,共勉,呵呵~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-16 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表