首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

很奇怪的处理中文出现乱码有关问题

2012-03-15 
很奇怪的处理中文出现乱码问题问题描述如下:从网页中取到一个字符串,如:txt1abc&txt2123%E4%B8%AD%E5%9B

很奇怪的处理中文出现乱码问题
问题描述如下:
从网页中取到一个字符串,如:txt1=abc&txt2=123%E4%B8%AD%E5%9B%BD&iud=2&submit=submit

如果用cin.read(char*   content,len)赋值到content变量上,将变量输出后,在这个字符串的最后会多出一些额外的字符(不知是不是mod_fastcgi的Bug),但将这个变量放入解码函数中解码出来的中文是正确的。

如果这样:
ostringstream   oo;
oo.write(content,len);
cout   < <   oo.str();
未解码前的字符串是正确的,没有多出额外的字符。

但是,将oo.str().c_str()进行中文解码时出现中文乱码,又另外写了一个对string进行解码的函数,也解不出来。

请教c++高手,什么地方出的错?

解码函数见下:

  47                   void   Parser::getDecoded(map <string,string>   &m,   string   str)
  48                   {
  49                           vector <string>   vv;
  50                           string   oneSec;
  51
  52                           for(int   i=0;   i <str.size();   i++)
  53                           {
  54                                   char   ch   =   str[i];
  55
  56                                   switch(ch)
  57                                   {
  58                                           case   '% ':
  59                                                   char   c1   =   hex(str[i++]);
  60                                                   char   c2   =   hex(str[i++]);
  61                                                   ch   =   c1   *   16   +   c2;
  62                                                   break;
  63                                           case   '+ ':
  64                                                   ch   =   '   ';
  65                                                   break;
  66                                   }
  67
  68                                   if(ch   ==   '& ')


  69                                   {
  70                                           vv.push_back(oneSec);
  71                                           oneSec   =   " ";
  72                                           continue;
  73                                   }
  74
  75                                   oneSec   +=   ch;
  76
  77                           }//while(   end*/
  78
  79                           vv.push_back(oneSec);
  80                           for(int   i=0;   i <vv.size();   ++i)
  81                           {
  82                                   string   ss   =   vv[i];
  83                                   m[ss.substr(0,ss.find( "= "))]   =
  84                                           ss.substr(ss.find( "= ")+1);
  85                           }
  86
  87                   }
  88
  89
  90                   void   Parser::getDecoded(map <string,string>   &m,   char*   str)
  91                   {
  92                           vector <string>   vv;
  93                           string   oneSec;
  94
  95                           while(*str)
  96                           {
  97                                   char   ch   =   *str++;
  98
  99                                   switch(ch)
100                                   {
101                                           case   '% ':


102                                                   char   c1   =   hex(*str++);
  89
  90                   void   Parser::getDecoded(map <string,string>   &m,   char*   str)
  91                   {
  92                           vector <string>   vv;
  93                           string   oneSec;
  94
  95                           while(*str)
  96                           {
  97                                   char   ch   =   *str++;
  98
  99                                   switch(ch)
100                                   {
101                                           case   '% ':
102                                                   char   c1   =   hex(*str++);
103                                                   char   c2   =   hex(*str++);
104                                                   ch   =   c1   *   16   +   c2;
105                                                   break;
106                                           case   '+ ':
107                                                   ch   =   '   ';
108                                                   break;
109                                   }
110
111                                   if(ch   ==   '& ')
112                                   {
113                                           vv.push_back(oneSec);


114                                           oneSec   =   " ";
115                                           continue;
116                                   }
117
118                                   oneSec   +=   ch;
119
120                           }//while(   end*/
121
122                           vv.push_back(oneSec);
123                           for(int   i=0;   i <vv.size();   ++i)
124                           {
125                                   string   ss   =   vv[i];
126                                   m[ss.substr(0,ss.find( "= "))]   =
127                                           ss.substr(ss.find( "= ")+1);
128                           }
129                   }

  12                   int   Parser::hex(char   c)
  13                   {
  14                           if(   isdigit(c))
  15                                   return   c   -   '0 ';
  16                           else   if(   isalpha(c)   )
  17                                   return   tolower(c)   -   'a '   +   10;
  18                           else
  19                                   return   0;
  20                   }
  21

[解决办法]
關注...
[解决办法]
参考这个修正一下吧:

【引用】把gbk汉字的两个字节对应的两个数字用16进制表示,然后前面加一个%,如汉字“媒”对应的两个字节就分别是c3,bd
给你编码解码函数:
/// URL encoding
string URLEncode(const string& input)
{
string text;
for(unsigned int i=0;i <input.length();i++)
{
if(input[i] == 0x20)
{
text += "+ ";
continue;
}


if(input[i]*0x80)
{
int c1 = (unsigned char)input[i];
text += "% " + DecimalToHexstr(c1);
i++;
int c2 = (unsigned char)input[i];
text += "% " + DecimalToHexstr(c2);
continue;
}

if(ispunct(input[i]))
{
text += "% ";
text += input[i];
continue;
}

text += input[i];
}

return text;
}

/// URL decoding
string URLDecode(const string& input)
{
// decoding
string text;
for(unsigned int i=0;i <input.length();)
{
if(input[i]== '+ ')
{
text += " ";
i++;
continue;
}

if(input[i]!= '% ')//if inserted some ASCII characters
{
text += input[i];
i++;
continue;
}

/* convert hex to decimal, then to ASCII char.*/
string sHex = " ";
sHex += input[i+1];
sHex += input[i+2];
sHex = "0x " + sHex;
text += (char)strtol(sHex.c_str(),NULL,16);

i +=3;
}

return text;
}

热点排行