关于编码问答

 

最近搞多国语言程序,对于一些问题还是一知半解
希望高手能够开导一下

本文不涉及使用TNTUNICODE控件问题,那个很好用

1.unicode编码如何转换为本地字符集编码,如GB2312,用哪个API?

2.如果我用上面的API,是不是可以把UNICODE编码转换到各个不同的WINDOWS的本地编码上去
如,中文简体转为GB2312
繁体转为BIG5
日文转为SHIFT-JIS
等等....

这样,不就可以在不同国家的WINDOWS上显示本地语言了吗?
是这样理解吗?

3.如果这样把unicode编码转换过去之后,那么我只是得到了GB2312之类的一套编码
如何将这些编码找到点阵字符集呢
是不是要同时指定程序界面使用的字体

Font = "宋体"  //之类
如果是日文
Font = "日文某字体"


4.经常听说936,CODEPAGE,这是怎么回事


5.按照以上方法,是不是就可以解决多国语言的问题了

本文不涉及使用Tntunicode控件,请不要讨论这个控件的问题,更不要推荐
 
 
 

 

 

 

发表于:2008-05-23 20:10:181楼 得分:0
6.如何知道本地的CODEPAGE编码,如何将这个参数填入那个API中让其转换
万一是中文WINDOWS,我故意选择个阿尔巴尼亚区域,那么得到的CODEPAGE还能是936吗?那不就错了吗
 
 

 

 

发表于:2008-05-24 10:18:102楼 得分:50
既然是UNICODE版本的程序,使用UNICODE版本的控件,就千万不要使用本地编码,那就把所有UNICODE的优势都给弄掉了。

先说UNICODE版本的程序:
使用UNICODE,一切编码的烦恼都没有了,因为不需要考虑文字编码了,也不用把字体换来换去的,一切变得非常轻松,非常简单。

1.语言用LCID表示,
0x0804 中文(简体)
0x0404 中文(繁體)
0x0409 英语(美国)

生成LCID的值:可以使用API函数MAKELANGID(语言, 语言子类型) 生成LCID的值
LCID lcidCHS = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED ); // 简体中文
LCID lcidCHT = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL); // 繁體中文
LCID lcidENU = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US        ); // 美國英語

2.识别系统的语言:
LCID GetThreadLocale(); // 当前线程的语言
LCID GetSystemDefaultLCID(); // 系统默认语言
LCID GetUserDefaultLCID(); // 用户默认语言

3.使用什么字体?
只要是支持UNICODE的字体都可以,即使是选错了语言,也能正确显示那个语言的文字,只是美观程度差一些。
推荐使用字体 (就用这个字体就行了,无论什么语言,除非有特殊需求):
字体名 = L"Tahoma"; // 用这个字体就很好,Windows 桌面、资源管理器等,都用的这个字体,任何语言都能很好的显示
字体大小 = 8; // 默认字体大小就能满足要求,一般都是8, 无论哪种语言,包括中文,效果都很好
字体字符集 =DEFAULT_CHARSET; // 对于UNICODE版本的程序,这个参数基本不起作用,默认就可以
 
 

 

发表于:2008-05-24 10:40:583楼 得分:0
下面说不使用UNICODE的程序,即使用本地编码的程序。楼主所有的几个问题,都是本地编码程序(非UNICODE)必须关心的。

1.unicode编码如何转换为本地字符集编码,如GB2312,用哪个API?

使用 WideCharToMultiByte 把UNICODE转为本地编码,本地编码用CodePage表示,简体中文936,繁体中文950

2.如果我用上面的API,是不是可以把UNICODE编码转换到各个不同的WINDOWS的本地编码上去
如,中文简体转为GB2312
繁体转为BIG5
日文转为SHIFT-JIS
等等....

这样,不就可以在不同国家的WINDOWS上显示本地语言了吗?
是这样理解吗?

可以转换,只要把CodePage写对了,就可以转换,无论哪种语言。但是如果在本地编码上显示,只能把和本地编码相同的CodePage显示出来不乱码,其他的和系统编码不同的编码虽然转换的正确,但是无法显示。

3.如果这样把unicode编码转换过去之后,那么我只是得到了GB2312之类的一套编码
如何将这些编码找到点阵字符集呢
是不是要同时指定程序界面使用的字体

Font = "宋体"  //之类
如果是日文
Font = "日文某字体"

字体的语言都是用的Charset表示的,我还没找到Charset与CodePage的对应关系的函数,如果想找某个语言的字体,用EnumFontFamiliesEx枚举一下字体就可以,在枚举之前,如果设置了枚举的Charset,可以找到对应的字体,如果没设Charset,枚举出来的是系统安装的所有字体。

4.经常听说936,CODEPAGE,这是怎么回事

可以通过LCID得到CodePage。

C/C++ code
           
           
UINT iCodePage = CP_ACP; const BufSize = 16 ; char CpBuf[BufSize]; if (GetLocaleInfo(lcId, LOCALE_IDEFAULTANSICODEPAGE, CpBuf, BufSize)) iCodePage = atoi(CpBuf);


5.按照以上方法,是不是就可以解决多国语言的问题了

可以,要正常显示改语言的文字,最重要的一点,就是字体的设置,必须选择正确的字体,而且字体的Charset正确也是关键当中的关键问题。

6.如何知道本地的CODEPAGE编码,如何将这个参数填入那个API中让其转换
万一是中文WINDOWS,我故意选择个阿尔巴尼亚区域,那么得到的CODEPAGE还能是936吗?那不就错了吗

先得到当前系统的语言LCID (上面的UNICODE帖子已经说了方法),然后通过LCID得到CodePage

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值