BASE 64復号の中国語文字化けし問題
2305 ワード
RFC 2045には、The encoded output stream must be represented in lines of no more than 76 characters each.Base 64の行は76文字を超えてはいけません.超えたら折り返し改行を追加します.
base 64で符号化されたデータは、76文字おきに、戻り改行記号「r」、「r」、「」が1バイトずつ占められている.したがって、データを復号する前に、データ中の折り返し改行を削除すると、折り返し改行による文字化けし問題を解決することができる.
折り返し改行要因による文字化けしの決定:
取得したデータを16進数に変換して印刷する、リターン改行文字'r'''''ASCIIコードテーブルに対応する16進数0 x 0 D 0 x 0 Aがあるかどうかを確認することができる.
以下は、リターン改行文字C++コードを削除します.
参照先:
http://blog.csdn.net/jifengwan/article/details/45460695 http://www.cnblogs.com/lijiale/p/5434050.html http://blog.sina.com.cn/s/blog_4eb5ae750101cq16.html
base 64で符号化されたデータは、76文字おきに、戻り改行記号「r」、「r」、「」が1バイトずつ占められている.したがって、データを復号する前に、データ中の折り返し改行を削除すると、折り返し改行による文字化けし問題を解決することができる.
折り返し改行要因による文字化けしの決定:
取得したデータを16進数に変換して印刷する、リターン改行文字'r'''''ASCIIコードテーブルに対応する16進数0 x 0 D 0 x 0 Aがあるかどうかを確認することができる.
以下は、リターン改行文字C++コードを削除します.
string s = "yangdiao\r
yangdiaoyangdiao";
int pszLen = s.length();
char *a = new char[pszLen+1];
memcpy(a, s.c_str(), pszLen);
for (int i = 0; iif (a[i] == 0x0D || a[i] == 0x0A)
{
for (int j = i; jif (j + 1 < pszLen)
a[j] = a[j + 1];
}
pszLen = pszLen - 1;
if (i>1)
i = i - 1;
}
}
char *b = new char[pszLen+1];
memcpy(b, a, pszLen);
b[pszLen] = 0x00;
printf(" : %s
",b);
delete a;
delete b;
参照先:
http://blog.csdn.net/jifengwan/article/details/45460695 http://www.cnblogs.com/lijiale/p/5434050.html http://blog.sina.com.cn/s/blog_4eb5ae750101cq16.html