本文提供一种方法,通过将字符串编码成Unicode格式,保证数据在展示和传输过程中万无一失。无论客户端浏览器如何改变编码,页面上的编码都不会乱码。 对于HTML/XML,采用 + 十位Unicode码 + ; 的形式格式化字符。 对于JS,采用 u + 4位Unicode码 来格式化字符串. 示例采用C#编写,使用了 中文、俄文、韩文、日文 来展示。对于PHP,文章末尾将会提到。 首先,有一个String的扩展类。
复制代码 代码如下: using System.Text.RegularExpressions; namespace XXOO { /// <summary> /// 扩展方法,提供Html编码 和 脚本编码 /// </summary> public static class StringExtension { private static string GetHtmlEncodedStr(Match m) { string x = m.ToString(); return string.Format("{0};", (int)x[0]); } /// <summary> /// 将字符串转换为HTML编码格式 /// </summary> /// <param>字符串</param> /// <returns>输出形如:中文丰厚警</returns> public static string HtmlEncode( this string text ) { return Regex.Replace(text , "([^ 00-127]|&|"|<|>|')" , new MatchEvaluator(GetHtmlEncodedStr) , RegexOptions.ECMAScript | RegexOptions.Compiled ); } private static string GetScriptEncodedStr(Match m) { string x = m.ToString(); return "u" + string.Format("{0:X}", (int)x[0]).PadLeft( 4, '0'); } /// <summary> /// 将字符串编码成Unicode格式 如:uXXXX /// </summary> /// <param>字符串</param> /// <returns>输出形如:u4E2Du6587u4E30u539Au8B66u65B9</returns> public static string ScriptEncode( this string text ) { return Regex.Replace(text , "([^ 00-127]|&|"|'|<|>|n|r|t)" , new MatchEvaluator(GetScriptEncodedStr) , RegexOptions.ECMAScript | RegexOptions.Compiled ); } } }
它提供了2个方法,给测试页面使用。 测试页面(ASP.Net)
复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <form runat="server"> <pre runat="Server"></pre> <asp:PlaceHolder runat="Server"></asp:PlaceHolder> </form> </body> </html>
测试页面代码:
复制代码 代码如下: using XXOO; namespace WebApplication1 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { var str = @"中文丰厚警方过后发达看见发的话该快发动机后购房贷款好 Китайское посольство в Ираке и Багдаде отделение 이라크에서 중국 대사관과 알의 바그다드 지사 - 만수르 호텔 イラクでの大使館やアルのバグダッド支局-マンスールホテル 1234567890!@#$%^&*()<>""'|}{][:; "; pre.InnerHtml = str.HtmlEncode(); HtmlGenericControl control = new HtmlGenericControl("script"); control.Attributes["language"] = "javascript"; control.Attributes["type"] = "text/javascript"; control.InnerHtml = string.Format("alert("{0}");", str.ScriptEncode()); placeHolder.Controls.Add(control); } } }
运行后得到的HTML:
复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> </title></head> <body> <form method="post" action="WebForm1.aspx"> <pre>中文丰厚警方过后发达看见发的话该快发动机后购房贷款好 Китайское посольство в Ираке и Багдаде отделение 이라크에서 중국 대사관과 알의 바그다드 지사 - 만수르 호텔 イラクでの大使館やアルのバグダッド支局-マンスールホテル 1234567890!@#$%^&*()<>"'\|}{][:; </pre> <script language="javascript" type="text/javascript"><!-- alert("u4E2Du6587u4E30u539Au8B66u65B9u8FC7u540Eu53D1u8FBEu770Bu89C1u53D1u7684u8BDDu8BE5u5FEBu53D1u52A8u673Au540Eu8D2Du623Fu8D37u6B3Eu597Du000Du000Au041Au0438u0442u0430u0439u0441u043Au043Eu0435 u043Fu043Eu0441u043Eu043Bu044Cu0441u0442u0432u043E u0432 u0418u0440u0430u043Au0435 u0438 u0411u0430u0433u0434u0430u0434u0435 u043Eu0442u0434u0435u043Bu0435u043Du0438u0435 u000Du000AuC774uB77CuD06CuC5D0uC11C uC911uAD6D uB300uC0ACuAD00uACFC uC54CuC758 uBC14uADF8uB2E4uB4DC uC9C0uC0AC - uB9CCuC218uB974 uD638uD154u000Du000Au30A4u30E9u30AFu3067u306Eu5927u4F7Fu9928u3084u30A2u30EBu306Eu30D0u30B0u30C0u30C3u30C9u652Fu5C40-u30DEu30F3u30B9u30FCu30EBu30DBu30C6u30EBu000Du000A1234567890!@#$%u005Eu0026*()u003Cu003Eu0022u0027u005Cu007Cu007Du007Bu005Du005B:;u000Du000A"); // --></script> </form> </body> </html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head><title> </title></head> <body> <form method="post" action="WebForm1.aspx"> <pre>中文丰厚警方过后发达看见发的话该快发动机后购房贷款好 Китайское посольство в Ираке и Багдаде отделение 이라크에서 중국 대사관과 알의 바그다드 지사 - 만수르 호텔 イラクでの大使館やアルのバグダッド支局-マンスールホテル 1234567890!@#$%^&*()<>"'\|}{][:; </pre> <script language="javascript" type="text/javascript"><!-- alert("u4E2Du6587u4E30u539Au8B66u65B9u8FC7u540Eu53D1u8FBEu770Bu89C1u53D1u7684u8BDDu8BE5u5FEBu53D1u52A8u673Au540Eu8D2Du623Fu8D37u6B3Eu597Du000Du000Au041Au0438u0442u0430u0439u0441u043Au043Eu0435 u043Fu043Eu0441u043Eu043Bu044Cu0441u0442u0432u043E u0432 u0418u0440u0430u043Au0435 u0438 u0411u0430u0433u0434u0430u0434u0435 u043Eu0442u0434u0435u043Bu0435u043Du0438u0435 u000Du000AuC774uB77CuD06CuC5D0uC11C uC911uAD6D uB300uC0ACuAD00uACFC uC54CuC758 uBC14uADF8uB2E4uB4DC uC9C0uC0AC - uB9CCuC218uB974 uD638uD154u000Du000Au30A4u30E9u30AFu3067u306Eu5927u4F7Fu9928u3084u30A2u30EBu306Eu30D0u30B0u30C0u30C3u30C9u652Fu5C40-u30DEu30F3u30B9u30FCu30EBu30DBu30C6u30EBu000Du000A1234567890!@#$%u005Eu0026*()u003Cu003Eu0022u0027u005Cu007Cu007Du007Bu005Du005B:;u000Du000A"); // --></script> </form> </body> </html>
这样,不管浏览器采用何种编码,页面都不会出现乱码。 ============================================== PHP PHP的情况就复杂一点,需要考虑mysql的编码。这些姑且不论。 下面给出一点示例,将GBK进行HTML编码。仅作参考:
复制代码 代码如下: (编辑:焦作站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|