彻底解决页面文字编码乱码问题
彻底解决页面文字编码乱码问题
发布时间:2016-12-29 来源:查字典编辑
摘要:本文提供一种方法,通过将字符串编码成Unicode格式,保证数据在展示和传输过程中万无一失。无论客户端浏览器如何改变编码,页面上的编码都不会...

本文提供一种方法,通过将字符串编码成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("", (int)x[0]);

}

/// <summary>

/// 将字符串转换为HTML编码格式

/// </summary>

/// <param name="text">字符串</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 name="text">字符串</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 id="form1" runat="server">

<pre runat="Server" id="pre"></pre>

<asp:PlaceHolder runat="Server" ID="placeHolder"></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 name="form1" method="post" action="WebForm1.aspx" id="form1">

<pre id="pre">中文丰厚警方过后发达看见发的话该快发动机后购房贷款好

Китайское посольство в Ираке и Багдаде отделение

이라크에서 중국 대사관과 알의 바그다드 지사 - 만수르 호텔

イラクでの大使館やアルのバグダッド支局-マンスールホテル

1234567890!@#$%^&*()<>"'\|}{][:;

</pre>

<script language="javascript" type="text/javascript"><></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 name="form1" method="post" action="WebForm1.aspx" id="form1">

<pre id="pre">中文丰厚警方过后发达看见发的话该快发动机后购房贷款好

Китайское посольство в Ираке и Багдаде отделение

이라크에서 중국 대사관과 알의 바그다드 지사 - 만수르 호텔

イラクでの大使館やアルのバグダッド支局-マンスールホテル

1234567890!@#$%^&*()<>"'\|}{][:;

</pre>

<script language="javascript" type="text/javascript"><></script>

</form>

</body>

</html>

这样,不管浏览器采用何种编码,页面都不会出现乱码。

==============================================

PHP

PHP的情况就复杂一点,需要考虑mysql的编码。这些姑且不论。

下面给出一点示例,将GBK进行HTML编码。仅作参考:

复制代码 代码如下:

function htmlEncode($text)

{

$encoded = "";

for( $index = 0; $index < strlen($text); $index++)

{

if( ord($text[$index]) <= 127 )

{

switch(ord($text[$index]))

{

case 34:

case 38:

case 39:

case 60:

case 62:

$encoded .= "" .ord($text[$index]).";";

break;

default:

$encoded .= $text[$index];

}

}

else

{

$char = $text[$index] . $text[$index+1];

$char = mb_convert_encoding( $char, "utf-16", "gbk");

$encoded .= "" . (ord($char[0])*256 + ord($char[1])) . ";";

$index++;

}

}

return $encoded;

}

function htmlEncode($text)

{

$encoded = "";

for( $index = 0; $index < strlen($text); $index++)

{

if( ord($text[$index]) <= 127 )

{

switch(ord($text[$index]))

{

case 34:

case 38:

case 39:

case 60:

case 62:

$encoded .= "" .ord($text[$index]).";";

break;

default:

$encoded .= $text[$index];

}

}

else

{

$char = $text[$index] . $text[$index+1];

$char = mb_convert_encoding( $char, "utf-16", "gbk");

$encoded .= "" . (ord($char[0])*256 + ord($char[1])) . ";";

$index++;

}

}

return $encoded;

}

然后通过XML返回,这样就能够彻底杜绝乱码。

复制代码 代码如下:

echo "<?xml version="1.0" encoding="utf-8"?>n";

echo "<result>";

echo "<success>". ($success ? 1 : 0) ."</success>";

echo "<message>" . htmlEncode($message) . "</message>";

if( $success )

{

echo "<nickname>" . htmlEncode($nickname) . "</nickname>";

echo "<userId>".$userId."</userId>";

echo "<siteId>".$siteId."</siteId>";

echo "<isTeacher>". ($isTeacher ? 1 : 0) ."</isTeacher>";

echo "<ipAddress>" . htmlEncode($ipAddress) . "</ipAddress>";

}

echo "</result>";

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangjia184/archive/2009/10/26/4728318.aspx

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新相关技巧学习
热门相关技巧学习
编程开发子分类