如何在Twitter更新中处理ISO-2022-JP(和其他字符集)?

我的部分应用程序接受任意文本并将其作为Twitter更新发布。 一切正常,直到发布外国(非ASCII / UTF7 / 8)字符集,然后事情不再有效。

例如,如果有人发布:
に投稿できる

它(在我的Visual Studio调试器代码中)变为:
=?ISO-2022-JP 2 B 4 GyRCJEtFajlGJEckLSRrGyhC?=

谷歌搜索告诉我,这代表(减去?作为分隔符)

=?ISO-2022-JP是文本编码
?B表示它是base64编码的
?GyRCJEtFajlGJEckLSRrGyhC? 是编码的字符串

对于我的生活,我无法弄清楚如何将这个字符串作为Twitter的原始日文字符的更新发布。 现在,将’=?ISO-2022-JP?B?GyRCJEtFajlGJEckLSRrGyhC?=’发送到Twitter将导致确切的发布。 我也尝试将字符串分成几部分,使用System.Text.Encoding从ISO-2022-JP转换为UTF8,反之亦然,base64解码而不是。 另外,我玩过状态更新的URL编码,如下所示:

string[] bits = tweetText.Split(new char[] { '?' }); if (bits.Length >= 4) { textEncoding = System.Text.Encoding.GetEncoding(bits[1]); xml = oAuth.oAuthWebRequest(TwitterLibrary.oAuthTwitter.Method.POST, url, "status=" + System.Web.HttpUtility.UrlEncode(decodedText, textEncoding)); } 

无论我做什么,结果都不会恢复正常。

编辑:最后得到它。 对于那些跟在家里的人来说,它非常接近下面列出的答案。 只是Visual Studios调试器指导我错误的方式和我正在使用的Twitter库中的一个错误。 最终结果如下:

 decodedText = textEncoding.GetString(System.Convert.FromBase64String(bits[3])); byte[] originalBytes = textEncoding.GetBytes(decodedText); byte[] utfBytes = System.Text.Encoding.Convert(textEncoding, System.Text.Encoding.UTF8, originalBytes); // now, back to string form decodedText = System.Text.Encoding.UTF8.GetString(utfBytes); 

谢谢大家。

这产生了您正在寻找的输出:

 using System; using System.Text; class Program { static void Main(string[] args) { string input = "に投稿できる"; Console.WriteLine(EncodeTwit(input)); Console.ReadLine(); } public static string EncodeTwit(string txt) { var enc = Encoding.GetEncoding("iso-2022-jp"); byte[] bytes = enc.GetBytes(txt); char[] chars = new char[(bytes.Length * 3 + 1) / 2]; int len = Convert.ToBase64CharArray(bytes, 0, bytes.Length, chars, 0); return "=?ISO-2022-JP?B?" + new string(chars, 0, len) + "?="; } } 

标准很棒,有很多可供选择。 ISO永远不会令人失望,有不少于3个ISO-2022-JP编码。 如果您遇到问题,请尝试编码50221和50222。

您对文本编码方式的理解似乎是正确的。 在python中

 'GyRCJEtFajlGJEckLSRrGyhC'.decode('base64').decode('ISO-2022-JP') 

返回正确的unicode字符串。 请注意,您需要先解码base64才能获得ISO-2022-JP编码的文本。