字符编码转换问题???

时间:2022-01-22 06:34:17
UnicodeString str="你好";
用函数1
转换成unicode编码
函数2
将unicode编码转回"你好";

14 个解决方案

#2


遍历字符串,将str[i]转成WORD值按十六进制方式输出.

#3


该回复于2010-01-16 00:31:02被版主删除

#4


 有具体实例吗?/

#5


转换成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累加

#6


如何转回?

#7


up

#8


晕楼主还没搞定挺简单的.思路都给你了.

转回"你好的思路".

假设"你好"的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);//转回你好

#9


UP

#10


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指的是控件,而非内部函数 

#11


没太看清题意,如果是要转成字串编码,用以下程序

  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);  //得到你好

#12


晕中,发现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);  //得到你好

}

#13


留念,以后可能用的到

#14


 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);  //得到你好

#1


#2


遍历字符串,将str[i]转成WORD值按十六进制方式输出.

#3


该回复于2010-01-16 00:31:02被版主删除

#4


 有具体实例吗?/

#5


转换成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累加

#6


如何转回?

#7


up

#8


晕楼主还没搞定挺简单的.思路都给你了.

转回"你好的思路".

假设"你好"的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);//转回你好

#9


UP

#10


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指的是控件,而非内部函数 

#11


没太看清题意,如果是要转成字串编码,用以下程序

  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);  //得到你好

#12


晕中,发现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);  //得到你好

}

#13


留念,以后可能用的到

#14


 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);  //得到你好