读书人

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

发布时间: 2012-03-15 11:50:38 作者: rapoo

很奇怪的处理中文出现乱码问题
问题描述如下:
从网页中取到一个字符串,如: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;
}

读书人网 >C++

热点推荐