为什么printf() 函数能支持中文输出,wprintf() 之类函数还要来干什么?

superflytiger 2008-09-18 06:55:27
首先TC下的函数是不支持中文的,这点不用怀疑。但是标准库里明明提供有支持宽字符集的函数,比如wprintf()、wistream输入类等。为什么使用VC6.0中使用printf() 、istream之类的非支持宽字符集的函数能对所有宽字符集进行操作?那wprintf()、wistream之类的函数或类型还要来干什么呢?特别是国内的教材,涉及对中文的输入输出时都使用printf()、scanf()等。讲到windows编程时又特别强调宽字符与ASCII字符。都有点懵了!
...全文
756 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuzigege 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 freshairfly 的回复:]
printf能输出中文,因为对于中文是采用multi-byte进行编码的,这时也是两个字节,并且不同的区域可能把这两个字节识别成不同的字符(可能是乱码)
Unicode是统一编码,所有字符都占用两个字节。
[/Quote]

感觉整个楼上只有这位仁兄说到点子上了。
printf之所以能处理中文,因为对于中文采用的MBCS编码的,即中文字符占两个字节,英文字符占一个字节,
所有的字符串处理函数,都会判断每个字节是不是一个多字节的起始字节(即判断字节的高位是不是1),
如果不是,就认为是英文字符,否则认为接下来的两个字节算一个字符。

而如果使用UNICODE编译程序,则是宽字符函数的天下,因为操作系统的内核是基于宽字符的,所以宽字符函数效率更高。

ForestDB 2008-09-23
  • 打赏
  • 举报
回复
先去看看Unicode,然后给个建议:是什么字符集(ASCII,Unicode)就用相应的那一套函数,不要混着使用。
mars_man 2008-09-22
  • 打赏
  • 举报
回复
win32会将ASCII在内部转换成UNICODE来处理,看看核心编程吧。
外部的包装函数只是为了代码兼容。
lyn870111 2008-09-22
  • 打赏
  • 举报
回复
讲windows编程的时候强调这些,是让你知道这里边是不一样的,但是你也应该意识到,微软的API已经对这些进行了处理,比如
#ifdef UNICODE
#define function(...) functionA(...)
#else
#define function(...) functionW(...)
#endif
然后你就不用太关心它了,所以你用的时候不觉得哪里变化了
superflytiger 2008-09-20
  • 打赏
  • 举报
回复
大家看看这个http://www.regexlab.com/zh/encoding.htm
freshairfly 2008-09-19
  • 打赏
  • 举报
回复
printf能输出中文,因为对于中文是采用multi-byte进行编码的,这时也是两个字节,并且不同的区域可能把这两个字节识别成不同的字符(可能是乱码)
Unicode是统一编码,所有字符都占用两个字节。
woshizhanhun 2008-09-19
  • 打赏
  • 举报
回复
一直还没注意这问题呢,学习了
zhaoyi2115 2008-09-19
  • 打赏
  • 举报
回复
看看 UNICODE 就知道为什么了
htqx 2008-09-18
  • 打赏
  • 举报
回复

了解一下字符的编码方式。

英文是单个字节,总共128个。然后扩展了一下,加入一些图形符号,256个。
中文内码的设计是基于128个的编码基础上,通过最高位为1来表示这个字符编码是中文的,需要两个字节连起来看。
其他国家和地区也是通过这种设计,结果大家的编码只能兼容原始的128字符编码,而相互之间覆盖了。
unicode修补了这种情况,从新编码了全世界的语言。
lann64 2008-09-18
  • 打赏
  • 举报
回复
楼主看到过半个汉字吗?夹了半个汉字,不仅这个字看不见,一行中之后的汉字都变成稀奇古怪的字了。
这就是按字节处理的结果。
lc19890326 2008-09-18
  • 打赏
  • 举报
回复
实际情况是printf之类的函数在windows下可以根据是否定义了_UNICODE来选择执行是宽字符版本函数还是非宽字符版本函数
6楼说的正确
建议楼主看看windows程序设计第二章内容 就非常清楚了
lzp765 2008-09-18
  • 打赏
  • 举报
回复
wprintf() 处理宽字符
printf() 处理单字符
过去的我 2008-09-18
  • 打赏
  • 举报
回复
因为windows要把所有字符先都转化为unicode的,w版是必须存在的,a版的是为了兼容以前的系统,
在调用时,windows内部做了转换,而这种转换在程序员看来是透明的,所以会产生w版没有用的错觉
希望我的理解是正确的.
superflytiger 2008-09-18
  • 打赏
  • 举报
回复
可以讲具体一点吗?
rollrock1987 2008-09-18
  • 打赏
  • 举报
回复
貌似也有这个问题 同病相怜 楼主 给点分吧 哈哈
K行天下 2008-09-18
  • 打赏
  • 举报
回复
了解宽字符,你要了解一些字符编码的知识
比如Unicode编码,这样你就知道宽字符的意义。

简单说,ASCII字符所表示的字符范围很有限,
UNICODE是统一的字符编码标准, 采用双字节对字符进行编码, 这样就可以涵盖了
jieao111 2008-09-18
  • 打赏
  • 举报
回复
UP
tgh621 2008-09-18
  • 打赏
  • 举报
回复
printf会把字符按单字节处理,而wprintf会把字符按双字节处理

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧