UNICODE控制台程序(VC2003)

双杯献酒 2008-02-02 12:57:56
我想用VC2003写一个UNICODE的程序,
由于这个源代码里面可能会出现多国的文字(比如汉语和韩语),
为了避免在IDE环境里出现乱码,我想吧源代码(*.h和*.cpp)保存为Unicode格式,

在SDI工程中,这个问题我已经解决,
见:


但是,在控制台程序中,虽然编译连接都没有问题,
但在窗口中的显示却不正确(源代码见下面).
我估计是控制台窗口的语言或者字符集设置不对,但不知道怎么弄.

请大家积极支招.

// 本程序中包含多种语言的字符串
// 在VC2003编译通过
// 本文件保存方式为
// 编码: Unicode (2000)
// 换行: Windows (CR LF)
// 但是在窗口中显示不正确
// 不能正确显示除了英语字母和汉字以外的其他字符.

#include "stdafx.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
wchar_t strData[][64] = {
L"/*",
L"China(Simplified): 中国(简体)",
L"China(Traditional): 中國(繁體)",
L"Korea: 한국",
L"Russia: Россия",
L"Saudi Arabia: المملكه العربية السعودية",
L"*/"
};

locale loc("chs");
wcout.imbue(loc);
int iCount = sizeof(strData)/sizeof(strData[0]);
for(int i = 0; i < iCount; ++i)
{
wcout << strData[i] << endl;
}
return 0;
}
...全文
752 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yssss1980 2008-02-11
  • 打赏
  • 举报
回复
理论上CRT是不支持真正意义的unicode 输出的
应该用Windows API WriteConsoleW

详细请看:
http://www.cppblog.com/sandy/archive/2006/06/21/8779.html
zhoujianhei 2008-02-04
  • 打赏
  • 举报
回复
在输出字体前,先设置对应的codepage,至少控制台是这样的。
up_down 2008-02-04
  • 打赏
  • 举报
回复
学习,关注,正跟字体打交道。
据说字体是一种资源,安装才能使用,不知道控制台是如何载入字体的?
ydlchina 2008-02-04
  • 打赏
  • 举报
回复
学习
双杯献酒 2008-02-04
  • 打赏
  • 举报
回复
我直接用ConsoleWriteW结果还是一样,
但我修改字体为"新宋体" 后,
Saudi Arabia: المملكه العربية السعودية",
正常了
但韩语还是显示不出来,变成了 口口口
看来字体也有问题
双杯献酒 2008-02-04
  • 打赏
  • 举报
回复
这个好象是 wcout 的缺陷,
它好象确实是把 unicode 转成 ansi 然后调用操作系统 A 系列函数,
操作系统再把ANSI 转成 unicode 然后显示.
双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
在SDI工程中,这个问题我已经解决,
见:

http://blog.csdn.net/iicup/archive/2008/02/02/2078037.aspx
双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
1200
Unicode UCS-2 Little-Endian (BMP of ISO 10646)

这个应该是Unicode

可是:
C:\> chcp 1200
无效代码页

在程序中用 ".1200" 会出异常.
........

我用的 WinXP SP2,
难道我还需要安装什么组件?
sjdev 2008-02-02
  • 打赏
  • 举报
回复
程序中:system("chcp +你所需要的codepage代码");

直接在cmd里使用chcp命令进行修改还没有试过。
双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
能不能把current code page设置成 unicode 呢?
aspnetwuxueyou 2008-02-02
  • 打赏
  • 举报
回复
控制台窗口都有current code page。
SetConsoleOutputCP就是设置控制台窗口的code page.
aspnetwuxueyou 2008-02-02
  • 打赏
  • 举报
回复
936的console就不能显示trademark和copyright字符,而1252就可以。
所以,我认为936窗口显示韩文可能会有问题,要设置为949.

codepage列表,可参考
http://www.devdiv.net/topic.asp?ARCHIVE=true&TOPIC_ID=825&SearchTerms=codepage
aspnetwuxueyou 2008-02-02
  • 打赏
  • 举报
回复
是你的控制台窗口。控制台窗口的codepage。
双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
其实我的string已经统一到Unicode了,
实际上应该已经不存在codepage问题才对呀.....
莫非printf需要在显示的时候把unicode转成MBCS ??
双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
To: aspnetwuxueyou
我知道
在source code中出现中文很不professional
我现在的情况是,我这里有一些原来韩国朋友写的代码,
所有注释和部分字符串是韩文
(就象我们写的程序带有一些中文, 当然很不professional,但是老板从$的角度看,这种东西现在和将来都还会大量涌现),
而我是用的简体中文环境.
所以我才想用这个方法.

双杯献酒 2008-02-02
  • 打赏
  • 举报
回复
非常感谢
SetConsoleOutputCP
等效于上面的
locale loc("chs");
wcout.imbue(loc);
是吧?

那就是说我必须把这个字符串分成几个部分,
每个部分使用不同的SetConsoleOutputCP吗?
Hiiishe 2008-02-02
  • 打赏
  • 举报
回复
关注中..
aspnetwuxueyou 2008-02-02
  • 打赏
  • 举报
回复
对于韩语,SetConsoleOutputCP就不能用936了。
另外,强烈建议,把这些字符移到资源文件中,在source code中出现中文很不professional,而且问题很多

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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