您现在的位置是:网站首页> 编程资料编程资料
彻底解决页面文字编码乱码问题_相关技巧_
2023-05-27
277人已围观
简介 彻底解决页面文字编码乱码问题_相关技巧_
本文提供一种方法,通过将字符串编码成Unicode格式,保证数据在展示和传输过程中万无一失。无论客户端浏览器如何改变编码,页面上的编码都不会乱码。
对于HTML/XML,采用 + 十位Unicode码 + ; 的形式格式化字符。
对于JS,采用 \u + 4位Unicode码 来格式化字符串.
示例采用C#编写,使用了 中文、俄文、韩文、日文 来展示。对于PHP,文章末尾将会提到。
首先,有一个String的扩展类。
using System.Text.RegularExpressions;
namespace XXOO
{
///
/// 扩展方法,提供Html编码 和 脚本编码
///
public static class StringExtension
{
private static string GetHtmlEncodedStr(Match m)
{
string x = m.ToString();
return string.Format("{0};", (int)x[0]);
}
///
/// 将字符串转换为HTML编码格式
///
/// 字符串
///输出形如:中文丰厚警
public static string HtmlEncode( this string text )
{
return Regex.Replace(text
, "([^\\000-\\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');
}
///
/// 将字符串编码成Unicode格式 如:\uXXXX
///
/// 字符串
///输出形如:\u4E2D\u6587\u4E30\u539A\u8B66\u65B9
public static string ScriptEncode( this string text )
{
return Regex.Replace(text
, "([^\\000-\\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" %>
测试页面代码:
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:
这样,不管浏览器采用何种编码,页面都不会出现乱码。
==============================================
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 "\n";
echo "";
echo "". ($success ? 1 : 0) ." ";
echo "" . htmlEncode($message) . " ";
if( $success )
{
echo "" . htmlEncode($nickname) . " ";
echo "".$userId." ";
echo "".$siteId." ";
echo "". ($isTeacher ? 1 : 0) ." ";
echo "" . htmlEncode($ipAddress) . " ";
}
echo " ";
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangjia184/archive/2009/10/26/4728318.aspx
对于HTML/XML,采用 + 十位Unicode码 + ; 的形式格式化字符。
对于JS,采用 \u + 4位Unicode码 来格式化字符串.
示例采用C#编写,使用了 中文、俄文、韩文、日文 来展示。对于PHP,文章末尾将会提到。
首先,有一个String的扩展类。
复制代码 代码如下:
using System.Text.RegularExpressions;
namespace XXOO
{
///
/// 扩展方法,提供Html编码 和 脚本编码
///
public static class StringExtension
{
private static string GetHtmlEncodedStr(Match m)
{
string x = m.ToString();
return string.Format("{0};", (int)x[0]);
}
///
/// 将字符串转换为HTML编码格式
///
/// 字符串
///
public static string HtmlEncode( this string text )
{
return Regex.Replace(text
, "([^\\000-\\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');
}
///
/// 将字符串编码成Unicode格式 如:\uXXXX
///
/// 字符串
///
public static string ScriptEncode( this string text )
{
return Regex.Replace(text
, "([^\\000-\\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" %>
测试页面代码:
复制代码 代码如下:
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:
复制代码 代码如下:
这样,不管浏览器采用何种编码,页面都不会出现乱码。
==============================================
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 "\n";
echo "
echo "
echo "
if( $success )
{
echo "
echo "
echo "
echo "
echo "
}
echo "