BCB多国语言再次提问

jyhd_23 2008-05-23 08:07:59
最近搞多国语言程序,对于一些问题还是一知半解
希望高手能够开导一下

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

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

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

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

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

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


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


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

本文不涉及使用Tntunicode控件,请不要讨论这个控件的问题,更不要推荐
...全文
197 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
下面说不使用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。

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
  • 打赏
  • 举报
回复
既然是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版本的程序,这个参数基本不起作用,默认就可以
jyhd_23 2008-05-23
  • 打赏
  • 举报
回复
6.如何知道本地的CODEPAGE编码,如何将这个参数填入那个API中让其转换
万一是中文WINDOWS,我故意选择个阿尔巴尼亚区域,那么得到的CODEPAGE还能是936吗?那不就错了吗
这是一款稳定,高效的多国语言开发包。只需要添加几个控件就可以使您的项目拥有各种语言的版本,并提供给用户多种语言的选择功能。您也可以方便的将以有的程序快速的升级到多国语言的版本。以及开发一个真正的UNICODE程序。功能描述 自带一套完整的UNICODE 标准控件,支持制作真正的UNICODE程序。并提供相应的多国语言类。NEW!! 自动在应用程序的当前目录下搜索可用的语言描述文件,或是使用指定的语言描述文件。 指定应用程序默认所使用的语言类型,或者让程序根据系统的默认字符集设置,自动使用相应的语言。 加载语言描述文件时,自动改变程序的字符集设置。 在应用程序启动,或更改使用的语言时,自动改变窗体(或Frame,DataModule,QuickReport)上的所有控件的文字。 自定义加载语言描述文件时,窗体控件的哪些属性将被更改。 支持所有已知或未知的组件。 只需要一行代码,就可以让程序轻松的提供给用户语言选择菜单。 通过OnLanguageChanged()事件,可以在语言描述文件被加载时,做一些额外的转换工作。 可以在语言描述文件中使用带参数的字符串,方便的组合出字符串,(用法类似于Format函数)。 所有窗口,与使用了多国语言基类的其它类,都可以在应用程序改变当前语言时,立刻更新为新的语言。 方便的从已有程序升级到支持多国语言的程序。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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