ExtractEncodingメソッドでRegexを使ってMETAタグからcharsetの部分を取り出しています。
Readメソッドでは、まず与えられたpathにあるhtmlファイルからExtractEncodingメソッドを使って適切な文字エンコードを取得します。その後取得した文字コードで読み取ったhtmlを変換しています。
Readメソッドでは、まず与えられたpathにあるhtmlファイルからExtractEncodingメソッドを使って適切な文字エンコードを取得します。その後取得した文字コードで読み取ったhtmlを変換しています。
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace Utility
{
public static class EncodingUtils
{
private static readonly Regex r = new Regex(
@"<META\s+http-equiv\s*=\s*Content-Type\s+content=\s*""[^""]*\s+charset\s*=\s*(?<charset>[^""\s]*).*""\s*>",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static string ExtractEncoding(string html)
{
string result = null;
lock (r)
{
Match m = r.Match(html);
if (m.Success)
{
result = m.Groups["charset"].Value;
}
}
return result;
}
public static string Read(string path)
{
using (StreamReader reader = new StreamReader(path))
{
string htmlString = reader.ReadToEnd();
string encodingName = ExtractEncoding(htmlString);
Encoding defaultEncoding = reader.CurrentEncoding;
if (encodingName != null && encodingName != defaultEncoding.BodyName)
{
Encoding actualEncoding = null;
try
{
actualEncoding = Encoding.GetEncoding(encodingName);
}
catch (ArgumentException)
{
}
if (actualEncoding != null)
{
htmlString = actualEncoding.GetString(defaultEncoding.GetBytes(htmlString));
}
}
return htmlString;
}
}
}
}
コメント