社区
ActiveX/COM/DCOM
帖子详情
100分求教如何在BCB中实现由Unicode码的到对应的字符和由字符得到对应的Unicode码!
superstarboy
2005-07-04 05:27:52
如题!
分不够还可以加!希望达人教我!
...全文
632
10
打赏
收藏
100分求教如何在BCB中实现由Unicode码的到对应的字符和由字符得到对应的Unicode码!
如题! 分不够还可以加!希望达人教我!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
最强悍的 VC VB反编译工具 Hex-Rays
最强悍的反编译工具 Hex-Rays。可以反编译 VB VC
BCB
Delphi 等等一切 x86/x64 代
码
为 C 代
码
。密
码
参见内附说明文件。我写了个简单的介绍 http://blog.caozhongyan.com/article.asp?id=19
全角
字符
unicode
码
对应
表
Uni. GB Uni. GB Uni. GB Uni. GB Uni. GB 00A4 A1E8 ¤ 00A7 A1EC § 00A8 A1A7 ¨ 00B0 A1E3 ° 00B1 A1C0 ± 00B7 A1A4 · 00D7 A1C1 × 00E0 A8A4 à 00E1 A8A2 á 00E8 A
BCB
下通过
Unicode
方式访问WIN32控件
一直以来大家在
BCB
中
使用
Unicode
控件都是用的Tnt那套控件包, 由于个人习惯在工程
中
一般不喜欢使用第3方控件! 最近由于工作需要, 工程
中
一些输入的地方需要输入其它语言的
字符
, 所以琢磨着不使用第3方控件的情况下对...
unicode
和
字符
互转
public class u{ public static void main(String[] args){ ... /*十六进制的数值 已经是
unicode
了 因为
unicode
是\u000d 这样格式的加4个十六进制数表示的*/ /*比如上面是61 你可以添加 0061 在.
Ansi
字符
串转换为
Unicode
字符
串的四种方法
Ansi
字符
串转换为
Unicode
字符
串的四种方法
ActiveX/COM/DCOM
703
社区成员
3,002
社区内容
发帖
与我相关
我的任务
ActiveX/COM/DCOM
C++ Builder ActiveX/COM/DCOM
复制链接
扫一扫
分享
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章