International UTF-8 Characters in Windows Phone 7 WebBrowser Control
我已经好久没有更新博客了,好像最近没有什么好要分享给大家的。因为我觉得我需要一些时间去整理我学习到的有关于Windows Phone 7 For Silverligtht 开发的知识。但是,有一个知识点我迫不及待的想要分享给大家,那就是国际化字符在WebBrowser控件中的使用。
通常来说,我们会遇到这样的问题:我们想显示带有国际字符的HTML文件。在Windows Phone 7中最直接的方法就是使用一个WebBrowser控件,调用它的"NavigateToString(string myString)" 方法显示HTML。
但是,当我们使用上述方法去显示带国际化字符的HTML(如日语,阿拉伯语,韩语,俄语或者中文字符)时,我们会得到下面的让人很迷惑的字符:
string testString = "<html><body>日本列島の占領の最初の兆候が縄文時代で約14,000のBC、竪穴住居の中石器時代新石器時代に半定住狩猟採集文化と農業の初歩的なフォームから続いて、30,000年頃旧石器文化と登場しました。</body></html>"; BrowserControl.NavigateToString(testString);
运行结果如下:
可能你对日语不是很熟悉,但是这个真的不是日语。这个只是我们想要看到的日语字符的ASCII码。为什么会出现这样的状况?我也不是很清楚原因。在正确显示这些字符的努力中我做了一次又一次的带着血泪的尝试。
直到我发现了这篇从名字上看来对于我们要解决的问题没有什么帮助的文章“Windows Phone 7 Character Testing...”(PS:原文地址已经打不开)。在那篇文章中,作者给我们提供了一个非常有用的方法,使用该方法我们就能转换我们要呈现的国际化字符:
private static string ConvertExtendedASCII(string HTML) { string retVal = ""; char[] s = HTML.ToCharArray(); foreach (char c in s) { if (Convert.ToInt32(c) > 127) retVal += "&#" + Convert.ToInt32(c) + ";"; else retVal += c; } return retVal; }
通过使用这个方法,我们仅简单修改一下我们的代码就能显示我们上面没有正常显示的字符。
BrowserControl.NavigateToString(ConvertExtendedASCII(testString));
运行结果为:
终于出结果了,我很高兴,真的很高兴。
修改了的字符转化代码:
private static string ConvertExtendedAscii(string html) { StringBuilder sb = new StringBuilder(); foreach (var c in html) { int charInt = Convert.ToInt32(c); if (charInt > 127) sb.AppendFormat(“&#{0};”, charInt); else sb.Append(c); } return sb.ToString(); }
坚持到最后的人才能看到好东西。可以是用如下的代码解决乱码问题.
StreamReader reader = new StreamReader(TitleContainer.OpenStream(“731999031.htm”), Encoding.GetEncoding(“unicode”));
原文地址:International UTF-8 Characters in Windows Phone 7 WebBrowser Control