简单的转换方法&#XXXX;从HTML到UTF-8XML在.Net中编程或使用工具
HTML和XML不一样,只是为了举例说明 用于输入HTML文件简单的转换方法&#XXXX;从HTML到UTF-8XML在.Net中编程或使用工具,.net,html,xml,utf-8,.net,Html,Xml,Utf 8,HTML和XML不一样,只是为了举例说明 用于输入HTML文件 <p class=MsoNormal style='tab-stops:.5in'><b><span style='mso-tab-count:3'> </span></b><b><span lang=AR-SY dir=RTL style='mso-bidi-language:AR-S
<p class=MsoNormal style='tab-stops:.5in'><b><span style='mso-tab-count:3'> </span></b><b><span
lang=AR-SY dir=RTL style='mso-bidi-language:AR-SY'>عزت
ابراهيم
الدوري</span><o:p></o:p></b></p>
&1593زت
ابراهيم
الدوري
使用UTF-8编码接收XML
<Name Type="Script"> صدام حسين التكريتي</Name>
基本上我需要一个ASCII序列xxxyyyyzzzz;要另存为utf-8。我不太确定您是要就地转换HTML十进制编码,还是要将HTML转换为XML文档。将十进制(或十六进制)编码字符转换为UTF-8/16并不太困难。然而,在野外正确解析HTML可能是一个挑战(请参见此) 下面是一个简单的类,用于转换十进制和十六进制编码字符并返回.Net字符串(我不保证它的正确性或健壮性,特别是当您试图对格式错误的HTML或具有代理项对字符时):
使用系统;
使用System.Collections.Generic;
利用制度全球化;
使用System.Text.RegularExpressions;
名称空间HtmlEncodingConverter
{
内部静态类HtmlEncoding
{
私有静态只读正则表达式EncodedCharRegex=新正则表达式(@“[X]?[0-9|A-F]{1,12};”,
RegexOptions.Compiled|
RegexOptions.IgnoreCase|
RegexOptions(文化变异);
公共静态字符串(字符串输入)
{
返回ConvertInnerText(输入,替换为字符);
}
专用静态字符串ReplaceWithCharacter(字符串原始)
{
返回EncodedCharRegex.Replace(原始,新的MatchEvaluator(DecodeCharacter));
}
私有静态字符串解码字符(匹配)
{
string digits=match.ToString().TrimStart(新[]{'#','&'}).TrimEnd(';').toupper不变量();
返回数字。用(“X”)开始?六进制字符串(数字):十进制字符串(数字);
}
专用静态字符串DecToString(字符串数字)
{
返回((char)int.Parse(digits)).ToString();
}
私有静态字符串HexToString(字符串数字)
{
返回((char)int.Parse(
数字。子字符串(1),
NumberStyles.HexNumber,
CultureInfo.InvariantCulture)).ToString();
}
私有静态字符串转换器InnerText(字符串原始,Func转换器)
{
var convertedQueue=新队列(原始.Length);
var innerQueue=新队列();
int tagCount=0;
bool hasfundhtml=false;
foreach(原始字符中的字符)
{
if(字符等于(“”))
{
tagCount-=1;
convertedQueue.Enqueue(字符);
继续;
}
if(tagCount==0&&hasFoundHtml)
{
innerQueue.Enqueue(字符);
}
其他的
{
convertedQueue.Enqueue(字符);
}
}
返回新字符串(convertedQueue.ToArray());
}
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions;
namespace HtmlEncodingConverter
{
internal static class HtmlEncoding
{
private static readonly Regex EncodedCharRegex = new Regex(@"&#[X]?[0-9|A-F]{1,12};",
RegexOptions.Compiled |
RegexOptions.IgnoreCase |
RegexOptions.CultureInvariant);
public static string ToUtfCharacters(string input)
{
return ConvertInnerText(input, ReplaceWithCharacter);
}
private static string ReplaceWithCharacter(string original)
{
return EncodedCharRegex.Replace(original, new MatchEvaluator(DecodeCharacter));
}
private static string DecodeCharacter(Match match)
{
string digits = match.ToString().TrimStart(new[] {'#', '&'}).TrimEnd(';').ToUpperInvariant();
return digits.StartsWith("X") ? HexToString(digits) : DecToString(digits);
}
private static string DecToString(string digits)
{
return ((char) int.Parse(digits)).ToString();
}
private static string HexToString(string digits)
{
return ((char) int.Parse(
digits.Substring(1),
NumberStyles.HexNumber,
CultureInfo.InvariantCulture)).ToString();
}
private static string ConvertInnerText(string original, Func<string, string> converter)
{
var convertedQueue = new Queue<char>(original.Length);
var innerQueue = new Queue<char>();
int tagCount = 0;
bool hasFoundHtml = false;
foreach (char character in original)
{
if (character.Equals('<'))
{
hasFoundHtml = true;
if (tagCount == 0 && innerQueue.Count > 0)
{
var innerString = new string(innerQueue.ToArray());
string convertedString = converter.Invoke(innerString);
foreach (char convertedCharacter in convertedString)
{
convertedQueue.Enqueue(convertedCharacter);
}
innerQueue.Clear();
}
tagCount += 1;
convertedQueue.Enqueue(character);
continue;
}
if (character.Equals('>'))
{
tagCount -= 1;
convertedQueue.Enqueue(character);
continue;
}
if (tagCount == 0 && hasFoundHtml)
{
innerQueue.Enqueue(character);
}
else
{
convertedQueue.Enqueue(character);
}
}
return new string(convertedQueue.ToArray());
}
}
}