为什么用wcout输出中文要先setlocale

Lactoferrin 2011-06-30 03:27:53
为什么用wcout和wprintf输出unicode的中文要先setlocale?
unicode不是本身就支持多国语言吗
...全文
1605 76 打赏 收藏 转发到动态 举报
写回复
用AI写文章
76 条回复
切换为时间正序
请发表友善的回复…
发表回复
libraleft 2012-04-25
  • 打赏
  • 举报
回复
wcout.imbue(locale(locale(),"",LC_CTYPE));
wcin.imbue(locale(locale(),"",LC_CTYPE));
hushoubo 2011-11-30
  • 打赏
  • 举报
回复
同意

[Quote=引用 38 楼 satiling 的回复:]
Unicode 是字符集,只是用来表示字符的。

Locale 决定的是这些字符以什么样的形式输出。
[/Quote]
赵4老师 2011-11-30
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。
中文简体Windows操作系统自带的字库中字模是按Unicode顺序索引还是按GBK顺序索引?
中文繁体Windows操作系统自带的字库中字模是按Unicode顺序索引还是按BIG5顺序索引?
用户 昵称 2011-07-02
  • 打赏
  • 举报
回复
俺也脚着可以直接输出,反正俺也不关注这个。
wesweeky 2011-07-02
  • 打赏
  • 举报
回复
必须 setlocale
zhan7505201 2011-07-02
  • 打赏
  • 举报
回复
学习。
kang321112 2011-07-02
  • 打赏
  • 举报
回复
sdfsefhel nl k
www_adintr_com 2011-07-01
  • 打赏
  • 举报
回复
国际化和本地化虽然有关系, 但确是两个不同的东西.

C++ 对国际化的支持是不完善的, 它的库并没有使用操作系统 API 的 W 版本.
zql602709051 2011-07-01
  • 打赏
  • 举报
回复
对我有用,看看。
yjgx007 2011-07-01
  • 打赏
  • 举报
回复
我猜想这里有两种模式:

1) 字符存储模式 2) 字符显示模式

如果要将字符显示正确, 就要将字符转成可显示的编码 - MBCS
rainman_13 2011-07-01
  • 打赏
  • 举报
回复
受教了,顶一个
rlexyum 2011-07-01
  • 打赏
  • 举报
回复
这个我认为就没有必要去纠结为什么不直接用UNICODE码了
存在即合理
知道他为什么不显示中文我觉得就已经够了

就好像 编码编码 知道怎么用编码就OK了 不用去知道每个字符是对应的怎样的十六进制
对吧

[Quote=引用 56 楼 lactoferrin 的回复:]

引用 51 楼 rlexyum 的回复:

引用 48 楼 lactoferrin 的回复:

MBCS的含义就是各个语言的编码方式不一样

unicode各个语言的编码方式就是一样的,无论是中文系统还是俄文系统你都是0x4f60(utf-16)

因此应该可以统一显示,hpsmouse和上面的代码显示vc运行库是有意地将unicode转换为了mbcs再来显示的


恩 ……
[/Quote]
jsjygm 2011-07-01
  • 打赏
  • 举报
回复
菜鸟学习来啦。
luciferisnotsatan 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 lactoferrin 的回复:]

我觉得wcout输出宽字符串时可以直接用WriteConsoleW,没必要转来转去
[/Quote]
有可能当年微软的系统还没有WriteConsoleW。
反正这个微软估计不会改了。
Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 rlexyum 的回复:]

引用 48 楼 lactoferrin 的回复:

MBCS的含义就是各个语言的编码方式不一样

unicode各个语言的编码方式就是一样的,无论是中文系统还是俄文系统你都是0x4f60(utf-16)

因此应该可以统一显示,hpsmouse和上面的代码显示vc运行库是有意地将unicode转换为了mbcs再来显示的


恩 你说的这些就是我刚才所说的啊
[/Quote]
你说为什么vc运行库要转一次,不直接输出
scandy 2011-07-01
  • 打赏
  • 举报
回复
路过打酱油
Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
我觉得wcout输出宽字符串时可以直接用WriteConsoleW,没必要转来转去
Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
DWORD c;
WriteFile(GetStdHandle(-11),"ababab哦咯斯蒂芬",sizeof("ababab哦咯斯蒂芬"),&c,0);
WriteFile(GetStdHandle(-11),L"ababab哦咯斯蒂芬",sizeof(L"ababab哦咯斯蒂芬"),&c,0);
输出
ababab哦咯斯蒂芬 a b a b a b 鎀疶痚倓瑐
rlexyum 2011-07-01
  • 打赏
  • 举报
回复
这也就是为什么要用到setlocale
rlexyum 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 lactoferrin 的回复:]

MBCS的含义就是各个语言的编码方式不一样

unicode各个语言的编码方式就是一样的,无论是中文系统还是俄文系统你都是0x4f60(utf-16)

因此应该可以统一显示,hpsmouse和上面的代码显示vc运行库是有意地将unicode转换为了mbcs再来显示的
[/Quote]

恩 你说的这些就是我刚才所说的啊
加载更多回复(56)

64,683

社区成员

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

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