関連性の高い質問は次のとおりです: Unicode punctuation を ASCII 近似で置き換える
そこの答えは不十分ですが、私にアイデアを与えてくれました。Basic Multilingual Plane (0) の各 Unicode コード ポイントを、対応する ASCII 文字 (存在する場合) にマップできます。次の C# コードは、各値の置換文字を入力できる HTML フォームを作成するのに役立ちます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.IO;
namespace UnicodeCharacterCategorizer
{
class Program
{
static void Main(string[] args)
{
string output_filename = "output.htm"; //set a filename if not specifying one through the command line
Dictionary<UnicodeCategory,List<char>> category_character_sets = new Dictionary<UnicodeCategory,List<char>>();
foreach (UnicodeCategory c in Enum.GetValues(typeof(UnicodeCategory)))
category_character_sets.Add( c, new List<char>() );
for (int i = 0; i <= 0xFFFF; i++)
{
if (i >= 0xD800 && i <= 0xDFFF) continue; //Skip ranges reserved for high/low surrogate pairs.
char c = (char)i;
UnicodeCategory category = char.GetUnicodeCategory( c );
category_character_sets[category].Add( c );
}
StringBuilder file_data = new StringBuilder( @"<!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>Unicode Category Character Sets</title><style>.categoryblock{border:3px solid black;margin-bottom:10px;padding:5px;} .characterblock{display:inline-block;border:1px solid grey;padding:5px;margin-right:5px;} .character{display:inline-block;font-weight:bold;background-color:#ffeeee} .numericvalue{color:blue;}</style></head><body><form id=""charactermap"">" );
foreach (KeyValuePair<UnicodeCategory,List<char>> entry in category_character_sets)
{
file_data.Append( @"<div class=""categoryblock""><h1>" + entry.Key.ToString() + ":</h1><br />" );
foreach (char c in entry.Value)
{
string hex_value = ((int)c).ToString( "x" );
file_data.Append( @"<div class=""characterblock""><span class=""character"">&#x" + hex_value + @";<br /><span class=""numericvalue"">" + hex_value + @"</span><br /><input type=""text"" name=""r_" + hex_value + @""" /></div>" );
}
file_data.Append( "</div>" );
}
file_data.Append("</form></body></html>" );
File.WriteAllText( output_filename, file_data.ToString(), Encoding.Unicode );
}
}
}
具体的には、このコードは、BMP 内のすべての文字を含む HTML フォームを、"r_" (r は "置換値" を表す) で始まる 16 進数値にちなんで名付けられた入力テキスト ボックスと共に生成します。これが ASP.NET ページに移植された場合、追加のコードを記述して、置換値を可能な限り事前設定することができます。
- すでにASCIIの場合は独自の値で、または
- Unicode で正規化された FormD または FormKD で分解された等価物、または
- カテゴリ全体の単一の ASCII 値 (つまり、すべての「句読点の頭文字」を ASCII 二重引用符で囲んだもの)
その後、手動で調整を行うことができますが、思ったほど長くはかからないでしょう。コードポイントは 64512 しかなく、カテゴリ全体の大きなチャンクは、おそらく「ASCII に近いものはない」として却下できます。そこで、このマップと関数を作成します。