在HTML页面中、Javascript脚本中、以及XML数据传输中,因为编码导致的问题不计其数。
本文提供一种方法,通过将字符串编码成Unicode格式,保证数据在展示和传输过程中万无一失。无论客户端浏览器如何改变编码,页面上的编码都不会乱码。
对于HTML/XML,采用 &# + 十位Unicode码 + ; 的形式格式化字符。
对于JS,采用 \u + 4位Unicode码 来格式化字符串.
示例采用C#编写,使用了 中文、俄文、韩文、日文 来展示。对于PHP,文章末尾将会提到。
首先,有2个String的扩展方法
它提供了2个方法,给测试页面使用。
测试页面(ASP.Net)
/// <summary>
/// Html Encode string, support all charactoers in the world
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string SafeHtmlEncode(this string str)
{
if (string.IsNullOrEmpty(str)) return string.Empty;
return Regex.Replace(str
, "([^\\x00-\\x7F]|&|\\\"|\\<|\\>|'|\\n|\\r|\\t)"
, new MatchEvaluator(delegate(Match m) { string x = m.ToString(); return string.Format("&#{0};", (int)x[0]); })
, RegexOptions.ECMAScript | RegexOptions.Compiled
);
}
/// <summary>
/// Html Encode string, support all charactoers in the world
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string HtmlEncodeSpecialCharactors(this string str)
{
if (string.IsNullOrEmpty(str)) return string.Empty;
return Regex.Replace(str
, "[^\\x00-\\x7F]"
, new MatchEvaluator(delegate(Match m) { string x = m.ToString(); return string.Format("&#{0};", (int)x[0]); })
, RegexOptions.ECMAScript | RegexOptions.Compiled
);
}
测试页面代码:
运行后得到的HTML:
这样,不管浏览器采用何种编码,页面都不会出现乱码。
==============================================
PHP
PHP的情况就复杂一点,需要考虑mysql的编码。这些姑且不论。
下面给出一点示例,将GBK进行HTML编码。仅作参考:
然后通过XML返回,这样就能够彻底杜绝乱码。
补充Javascript和ActionScript: