字符编码转换问题???

52vc 2010-01-15 03:41:35
UnicodeString str="你好";
用函数1
转换成unicode编码
函数2
将unicode编码转回"你好";
...全文
284 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
52vc 2010-01-26
  • 打赏
  • 举报
回复
WideString s=Edit1->Text;
WideString s1;
AnsiString s2;
char buff[2000];//编码长度2000
wchar_t buff1[500];//字符长度500

BinToHex((char *)s.c_bstr(),buff,s.Length()*2);
buff[s.Length()*4]='\0';
Memo1->Lines->Add(buff); //得到编码:604F7D59


HexToBin(buff,(char *) buff1,s.Length()*2);
buff1[s.Length()]=0;
s2=buff1; //先赋给AnsiString
s1=s2; //转成unicode
Memo1->Lines->Add(s1); //得到你好
geneshell 2010-01-25
  • 打赏
  • 举报
回复
留念,以后可能用的到
柯本 2010-01-24
  • 打赏
  • 举报
回复
晕中,发现BCB6的一个问题(是我晕了吗?...)
以下这么简单的程序会出错,在IDE下,运行
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString s;
wchar_t *p=L"你好";
s=p;
Edit1->Text=s;
} //经查,是在调用WideString的析构函数出错
会弹出CPU窗口,且Edit上无显示
多转一层就没问题了:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString s;
String s1;
wchar_t *p=L"你好";
s1=p;
s=s1;
Edit1->Text=s;
} //这里,s中为unicode内码:604F7D59
运行环境为BCB6+XP(SP3)及BCB6+windwos virtual(win7的virtual XP mode)
在win7+bcb2010下就没问题
所以上面的程序
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString s=L"你好";
WideString s1;
AnsiString s2;
char buff[9];
wchar_t buff1[3];

BinToHex((char *)s.c_bstr(),buff,4);
buff[8]='\0';
Memo1->Lines->Add(buff); //得到编码:604F7D59


HexToBin(buff,(char *) buff1,4);
buff1[2]=0;
s2=buff1; //先赋给AnsiString
s1=s2; //转成unicode
Memo1->Lines->Add(s1); //得到你好

}
TripH0101 2010-01-23
  • 打赏
  • 举报
回复
UP
柯本 2010-01-23
  • 打赏
  • 举报
回复
没太看清题意,如果是要转成字串编码,用以下程序

WideString s=L"你好";
WideString s1;
char buff[9];
wchar_t buff1[3];

BinToHex((char *)s.c_bstr(),buff,4);
buff[8]='\0';
Memo1->Lines->Add(buff); //得到编码:604F7D59


HexToBin(buff,(char *) buff1,4);
buff1[2]=0;
s1=buff1; //我的BCB6会在这报错,C2010没问题

Memo1->Lines->Add(s1); //得到你好

柯本 2010-01-23
  • 打赏
  • 举报
回复
BCB本身就有,且可以自动转换
你用以下程序看看吧:
unsigned char *p;
String e;

WideString s=L"你好"; //s中为unicode编码

p=(unsigned char *)s.c_bstr();
e.printf("%02x %02x %02x %02x",p[0],p[1],p[2],p[3]);

Memo1->Lines->Add(e);

AnsiString s1;
s1=s; //这里,自动转为AnsiString,s1中为GBK码

p=(unsigned char *)s1.c_str();
e.printf("%02x %02x %02x %02x",p[0],p[1],p[2],p[3]);
Memo1->Lines->Add(e);

-----------------
结果为:
60 4f 7d 59 //你好 的unicode编码
e4 e3 ba c3 //你好 的GBK编码

以上代码在BCB6中测试
所谓BCB6不支持unicode指的是控件,而非内部函数
hemiya 2010-01-22
  • 打赏
  • 举报
回复
晕楼主还没搞定挺简单的.思路都给你了.

转回"你好的思路".

假设"你好"的16进制的字符串为(数值不对,举个例子)
str = "AABBCCDD"

1,先把"AA"这个16进制字符串转换为char,这样有4个char.
2,把这个4个char依次赋值到一个6byte的数组里,例如char *wbuf= new char[str.Length() + 2];
3,把wbuf最后两个赋值为NULL.
4,UnicodeString cnok((wchar_t *)wbuf);//转回你好
52vc 2010-01-22
  • 打赏
  • 举报
回复
up
52vc 2010-01-19
  • 打赏
  • 举报
回复
如何转回?
hemiya 2010-01-16
  • 打赏
  • 举报
回复
转换成unicode编码

UnicodeString str=L"你好";
UnicodeString str2, str3;

for (int i=1; i<=str.Length(); i++)
{
str3 = IntToHex((unsigned int)str[i], 2)
str2 += str3.SubString(str3.Length()-4, 4);
}

unicode编码转回"你好",麻烦点,还要注意字节的高低端.
每4组str2[i]到str2[i+4]转换成一个wchar_t,再用个UnicodeString str5累加
52vc 2010-01-16
  • 打赏
  • 举报
回复
有具体实例吗?/

ccrun.com 2010-01-15
  • 打赏
  • 举报
回复
遍历字符串,将str[i]转成WORD值按十六进制方式输出.

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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