using System.Text;
using System.Web;
namespace TestProject;
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 문자 테이블 출력하기 - DisplayCharacterTable(sourceArray, columnDictionary)
/// <summary>
/// 문자 테이블 출력하기
/// </summary>
/// <param name="sourceArray">소스 배열</param>
/// <param name="columnDictionary">컬럼 딕셔너리</param>
private static void DisplayCharacterTable(string[] sourceArray, Dictionary<string, Func<string, string>> columnDictionary)
{
foreach(string key in columnDictionary.Keys)
{
Console.Write(key.Replace(" ", "[space]") + " ");
}
Console.WriteLine();
foreach(string source in sourceArray)
{
foreach(string columnHeader in columnDictionary.Keys)
{
int columnWidth = columnHeader.Length + 1;
Func<string, string> columnFunction = columnDictionary[columnHeader];
string target = columnFunction(source);
// 가정 : 컬럼 헤더는 항상 인코딩된 문자열보다 넓다.
Console.Write(target.Replace(" ", "[space]").PadRight(columnWidth));
}
Console.WriteLine();
}
}
#endregion
#region 문자 테이블 출력하기 - DisplayCharacterTable()
/// <summary>
/// 문자 테이블 출력하기
/// </summary>
private static void DisplayCharacterTable()
{
string sourceString = "ABCD" + "abcd" + "0123" + " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" + "ĀāĒēĪīŌōŪū";
// 비 ASCII 문자를 올바르게 표시하려면 콘솔 인코딩을 설정해야 한다(예: ĀāĒē...와 같은 라틴 A 확장 문자).
Console.OutputEncoding = Encoding.UTF8;
// 또한 콘솔 글꼴(콘솔 속성 대화 상자에서)을 확장된 문자 집합을 올바르게 표시하는 글꼴로 설정해야 한다.
// 다음 글꼴은 모두 확장 문자를 올바르게 표시한다.
// Consolas
// DejaVu Sana Mono
// Lucida Console
// 또한 콘솔 속성에서 화면 버퍼 크기 및 창 크기 너비 속성을 최소 140자로 설정하여 생성된 테이블의 전체 너비를 표시한다.
Dictionary<string, Func<string, string>> columnDictionary = new Dictionary<string, Func<string, string>>();
columnDictionary.Add("Unencoded" , source => source );
columnDictionary.Add("UrlEncoded" , source => HttpUtility.UrlEncode(source) );
columnDictionary.Add("UrlEncodedUnicode" , source => HttpUtility.UrlEncodeUnicode(source) );
columnDictionary.Add("UrlPathEncoded" , source => HttpUtility.UrlPathEncode(source) );
columnDictionary.Add("EscapedDataString" , source => Uri.EscapeDataString(source) );
columnDictionary.Add("EscapedUriString" , source => Uri.EscapeUriString(source) );
columnDictionary.Add("HtmlEncoded" , source => HttpUtility.HtmlEncode(source) );
columnDictionary.Add("HtmlAttributeEncoded", source => HttpUtility.HtmlAttributeEncode(source));
columnDictionary.Add
(
"HexEscaped",
source =>
{
// Uri.HexEscape는 처음 255자만 처리할 수 있으므로 A와 같은 라틴 A 확장 문자의 경우 ArgumentOutOfRange 예외가 발생한다.
try
{
return Uri.HexEscape(source.ToCharArray()[0]);
}
catch
{
return "[OoR]";
}
}
);
char[] sourceCharacterArray = sourceString.ToCharArray();
string[] sourceStringArray = Array.ConvertAll<char, string>(sourceCharacterArray, character => character.ToString());
DisplayCharacterTable(sourceStringArray, columnDictionary);
}
#endregion
#region 프로그램 시작하기 - Mani()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
DisplayCharacterTable();
}
#endregion
}