加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

彻底解决页面文字编码乱码问题

发布时间:2020-03-16 09:26:56 所属栏目:安全 来源:互联网
导读:在HTML页面中、Javascript脚本中、以及XML数据传输中,因为编码导致的问题不计其数。
本文提供一种方法,通过将字符串编码成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编码。仅作参考:

复制代码 代码如下:

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读