100分求教如何在BCB中实现由Unicode码的到对应的字符和由字符得到对应的Unicode码!

superstarboy 2005-07-04 05:27:52
如题!
分不够还可以加!希望达人教我!
...全文
632 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2005-07-27
  • 打赏
  • 举报
回复
不是我看不懂适因为WideCharToMultiByte在C++builder6的help里面查不到?
还有如果我想在BITMAP上以UNICODE字符为字符源输出字符!应该怎么办呢?
=================================
直接使用TextOutW或者DrawTextW

現在的具體問題是在給定Unicode碼的情況下(比如0x4eda),如何得到對應Ansistring的字符串!希望大家給的解答能在BCB6下調試通過能夠實現我所描述的功能!小弟在這裡先謝過了!要分的話還可以加的!
=================================
前面已经说过了在Unicode转换成AnsiString串时需要考虑编码类型,因为某些编码(正确的说应该是ANSI代码页)对某些字符可能不做支持,那么就无法转换。

从上面偶贴出滴代码当中就可以转抱,而楼主若是需要滴是AnsiString那对就直接将Char数组转换一下就好了.
下面贴一段之前写得差不多,但是没有多少实用价值的代码给楼主做参考
---------------------------------------------------------------
//.H
//---------------------------------------------------------------------------

#ifndef ConvertExcelH
#define ConvertExcelH
#include <system.hpp>
#include <Variants.hpp>
//---------------------------------------------------------------------------
//使用OLE控制来实现对每个单元格的内容做编码转换
//由于Excel当中最多有256列*16777216行(4294967296)个单元格
//而实际用户数据并没有如此多
//所以选使用一种模糊判定式确实最后一行和最后一列
//也就是可以设置一个判定值,比如连续20行的所有列名N列没有数据
//就表示后面将不会有数据?列与此相类似

//转换类型,这里可以自行扩展
typedef enum {
AnsiConvGBtoBIG5 = 0x00000001,
AnsiConvBIG5toGB = 0x00000010,
AutoWideGBtoBIG5 = 0x00000100,
AutoWideBIG5toGB = 0x00001000,
C950WideGBtoBIG5 = 0x00010000,
C950WideBIG5toGB = 0x00100000,
C936WideGBtoBIG5 = 0x01000000,
C936WideBIG5toGB = 0x10000000
}xlConvertType;

typedef enum {
cvxLCMAP_SIMPLIFIED_CHINESE = 0x02000000,
cvxLCMAP_TRADITIONAL_CHINESE = 0x04000000
}cvxLDMF;

typedef enum {
cvxLCID_GB = 0x0804,/*简体*/
cvxLCID_BIG5 = 0x0404 /*繁体*/
}cvxLCID;

typedef enum {
cvxCP_936 = 936,
cvxCP_950 = 950
}cvxCodePage;

AnsiString CodeMap_GBBIG5(cvxCodePage cvxCP_SRC,
cvxCodePage cvxCP_DST,
AnsiString Value);

WordBool LCMAPConvert(cvxLCID LCID,
AnsiString Source,
AnsiString &Destination,
cvxLDMF LanguageType);

AnsiString ConvertGBBIG5(WideString Value,xlConvertType ConvertType);


#endif
------------------------------------------------------
//.CPP
AnsiString ConvertGBBIG5(WideString Value,xlConvertType ConvertType)
{
AnsiString Result;
xlConvertType wConvertType=ConvertType;
unsigned int wACP=GetACP();
AnsiString wValue=Value;

char lpDefaultChar=' ';
int lpUsedDefaultChar;
_SIZE_T wLen=wcslen(Value.c_bstr());

char *szDst=new char[wLen*2+1];
ZeroMemory(szDst,wLen*2+1);

WideCharToMultiByte(cvxCP_936,0,
Value.c_bstr(),
wLen,
szDst,
wLen*2+1,
&lpDefaultChar,
&lpUsedDefaultChar);
wValue=AnsiString(szDst);
delete[] szDst;
int iwLen=wLen;
wchar_t *wszSRC=new wchar_t[iwLen+1];
ZeroMemory(wszSRC,(iwLen+1)*2);
LCMAPConvert(cvxLCID_GB,
wValue,
wValue,
cvxLCMAP_TRADITIONAL_CHINESE);
MultiByteToWideChar(cvxCP_936,0,
wValue.c_str(),
wValue.Length()+1,
wszSRC,
wValue.Length()+1);
wValue=AnsiString(wszSRC);
delete[] wszSRC;

if(AutoWideGBtoBIG5==wConvertType)
/*0x00000100*/ //自动转换简体到繁体Unicode支持
switch(wACP)
{
case 936:
wConvertType=C936WideGBtoBIG5;
break;
case 950:
wConvertType=C950WideGBtoBIG5;
break;
default:
wConvertType=0;
}

if(AutoWideBIG5toGB==wConvertType)
/*0x00001000*/ //自动转换繁体到简体Unicode支持
switch(wACP)
{
case 936:
wConvertType=C936WideBIG5toGB;
break;
case 950:
wConvertType=C950WideBIG5toGB;
break;
default:
wConvertType=0;
}

switch(wConvertType)
{
case AnsiConvGBtoBIG5: /*0x00000001*/ //Ansi GB_2312转Big5
Result=CodeMap_GBBIG5(cvxCP_936,cvxCP_950,wValue);
break;
case AnsiConvBIG5toGB: /*0x00000010*/ //Ansi Big5转GB_2312
Result=CodeMap_GBBIG5(cvxCP_950,cvxCP_936,wValue);
break;
case C950WideGBtoBIG5: /*0x00010000*/
//C_950(即繁体环境)简体转繁体Unicode支持
LCMAPConvert(cvxLCID_BIG5,wValue,Result,cvxLCMAP_TRADITIONAL_CHINESE);
break;
case C950WideBIG5toGB: /*0x00100000*/
//C_950(即繁体环境)繁体转简体Unicode支持
LCMAPConvert(cvxLCID_BIG5,wValue,Result,cvxLCMAP_SIMPLIFIED_CHINESE);
break;
case C936WideGBtoBIG5: /*0x01000000*/
//C_936(即繁体环境)简体转繁体Unicode支持
LCMAPConvert(cvxLCID_GB,wValue,Result,cvxLCMAP_TRADITIONAL_CHINESE);
break;
case C936WideBIG5toGB: /*0x10000000*/
//C_936(即繁体环境)繁体转简体Unicode支持
LCMAPConvert(cvxLCID_GB,wValue,Result,cvxLCMAP_SIMPLIFIED_CHINESE);
break;
default:
Result=wValue;
}
return Result;
}

AnsiString CodeMap_GBBIG5(cvxCodePage cvxCP_SRC,
cvxCodePage cvxCP_DST,
AnsiString Value)
{
wchar_t *wszSrc;
char *szDst;
char lpDefaultChar=' ';
int lpUsedDefaultChar;
int iLen=Value.Length();
int wLen=(iLen+1)/2+1;
AnsiString Result=Value;
if(cvxCP_SRC==cvxCP_DST)
return Result;
wszSrc=new wchar_t[wLen];
try
{
szDst=new char[iLen+1];
try
{
ZeroMemory(wszSrc,wLen*2);
ZeroMemory(szDst,iLen+1);
if(cvxCP_SRC==cvxCP_936)
LCMAPConvert(cvxLCID_GB,
Value,
Result,
cvxLCMAP_TRADITIONAL_CHINESE);
MultiByteToWideChar(cvxCP_SRC,0,
Result.c_str(),
iLen+1,
wszSrc,
wLen);
WideCharToMultiByte(cvxCP_DST,0,
wszSrc,
wLen,
szDst,
iLen+1,
&lpDefaultChar,
&lpUsedDefaultChar);
Result=AnsiString(szDst);
if(cvxCP_SRC==cvxCP_950)
LCMAPConvert(cvxLCID_GB,
Result,
Result,
cvxLCMAP_SIMPLIFIED_CHINESE);
}
__finally
{
delete[] szDst;
}
}
__finally
{
delete[] wszSrc;
return Result;
}
}

WordBool LCMAPConvert(cvxLCID LCID,
AnsiString Source,
AnsiString &Value,
cvxLDMF LanguageType)
{
int iSourceLen;
char *sNew;
WordBool Result = false;
int iLen =Source.Length();
sNew=new char[iLen+1];
try
{
ZeroMemory(sNew,iLen+1);
LCMapString(LCID,
LanguageType,
Source.c_str(),
-1,
sNew,
iLen
);
Value=sNew;
Result = true;
}
__finally
{
delete[] sNew;
return Result;
}
}
superstarboy 2005-07-13
  • 打赏
  • 举报
回复
現在的具體問題是在給定Unicode碼的情況下(比如0x4eda),如何得到對應Ansistring的字符串!希望大家給的解答能在BCB6下調試通過能夠實現我所描述的功能!小弟在這裡先謝過了!要分的話還可以加的!
superstarboy 2005-07-12
  • 打赏
  • 举报
回复
不是我看不懂适因为WideCharToMultiByte在C++builder6的help里面查不到?
还有如果我想在BITMAP上以UNICODE字符为字符源输出字符!应该怎么办呢?
僵哥 2005-07-09
  • 打赏
  • 举报
回复
对不起!可是我想要的是得到每个字符的Unicode码!和由Unicode得到字符的方法!不是将一个类型的字符装换到UNICODE !
===============================
偶狂晕……不知道楼主能不能看得懂代码哦,偶怀疑中……
superstarboy 2005-07-08
  • 打赏
  • 举报
回复
对不起!可是我想要的是得到每个字符的Unicode码!和由Unicode得到字符的方法!不是将一个类型的字符装换到UNICODE !
leonatcs 2005-07-08
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4044/4044341.xml?temp=.9000666
僵哥 2005-07-04
  • 打赏
  • 举报
回复
简单转换:

char AnsiSSrc[]="How are you? 你好吗?\0"; //AnsiChar字源
wchar_t WideSSrc[]=L"How are you? 你好吗?\0"; //WideChar 字源

char AnsiSDst[100]; //AnsiChar 目标缓冲区
wchar_t WideSDst[100];//WideChar 目标缓冲区

memset(AnsiSDst,0,100*sizeof(char)); //初始化缓冲区
memset(WideSDst,0,100*sizeof(wchar_t));//初始化缓冲区

//转换
WideString WSStr=AnsiSSrc; //将Ansi串赋值给WideString,达到转换目的
AnsiString ASStr=WideSSrc; //将Wide串赋值给AnsiString,达到转换目的

//回写到目标缓冲区
strcpy(AnsiSDst,ASStr.c_str());
wcscpy(WideSDst,WSStr.c_bstr());


考虑字符集转换:
char AnsiSSrc_CHS[]="How are you? 你好嗎?\0"; //AnsiChar字源 (简体GBK)
char AnsiSSrc_CHT[]="How are you? 盾\0"; //AnsiChar字源 (繁体BIG5)
wchar_t WideSSrc[]=L"How are you? 你好嗎?\0"; //WideChar 字源

char AnsiSDst_CHS[100]; //AnsiChar 目标缓冲区(简体GBK)
char AnsiSDst_CHT[100]; //AnsiChar 目标缓冲区(繁体BIG5)
wchar_t WideSDst_From_CHS[100];//WideChar 目标缓冲区 (来源于简体的转换结果)
wchar_t WideSDst_From_CHT[100];//WideChar 目标缓冲区 (来源于繁体的转换结果)

memset(AnsiSDst_CHS,0,100*sizeof(char)); //初始化缓冲区
memset(AnsiSDst_CHT,0,100*sizeof(char)); //初始化缓冲区
memset(WideSDst_From_CHS,0,100*sizeof(wchar_t));//初始化缓冲区
memset(WideSDst_From_CHT,0,100*sizeof(wchar_t));//初始化缓冲区

char c=' ';//代码页欠缺字符,代填充值
int n=0; //代填充次数

//简体转Unicode
MultiByteToWideChar(936/*简体代码页(Codepage)代号*/,0,AnsiSSrc_CHS,strlen(AnsiSSrc_CHS),WideSDst_From_CHS,100*sizeof(wchar_t));

//Unicode转简体
WideCharToMultiByte( 936,0,WideSSrc,wcslen(WideSSrc),AnsiSDst_CHS,100*(sizeof(char)),&c,&n);


//繁体转Unicode
MultiByteToWideChar(950/*繁体代码页(Codepage)代号*/,0,AnsiSSrc_CHT,strlen(AnsiSSrc_CHT),WideSDst_From_CHT,100*sizeof(wchar_t));

//Unicode转繁体
WideCharToMultiByte( 950,0,WideSSrc,wcslen(WideSSrc),AnsiSDst_CHT,100*(sizeof(char)),&c,&n);
constantine 2005-07-04
  • 打赏
  • 举报
回复
加入6580503群,僵哥写了例子在里面
constantine 2005-07-04
  • 打赏
  • 举报
回复
用TntUnicodeControls
peng_p 2005-07-04
  • 打赏
  • 举报
回复
希望得到答案,QQ:285323676

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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