FileUpload サーバー コントロールを使用して、以前に保存された (Web ページとして、フィルター処理された) HTML ドキュメントを MS Word からアップロードしています。文字セットは windows-1252 です。ドキュメントには、通常の引用符だけでなくスマート引用符 (curly) も含まれています。また、よく見ると通常の TAB や SPACE 以外の文字である (どうやら) いくつかの空白スペースがあります。
StreamReader でファイルの内容をキャプチャすると、これらの特殊文字は疑問符に変換されます。デフォルトのエンコードがUTF-8で、ファイルがUnicodeであるためだと思います。
私は先に進み、Unicode エンコーディングを使用して StreamReader を作成し、不要な文字をすべて正しい文字 (stackoverflow で実際に見つけたコード) に置き換えました。これはうまくいくようです....文字列をUTF-8に変換してasp:literalに表示することはできません。コードはそこにあり、動作するはずです....しかし、出力(ConvertToASCII)は判読できません。
以下をご覧ください。
protected void btnUpload_Click(object sender, EventArgs e)
{
StreamReader sreader;
if (uplSOWDoc.HasFile)
{
try
{
if (uplSOWDoc.PostedFile.ContentType == "text/html" || uplSOWDoc.PostedFile.ContentType == "text/plain")
{
sreader = new StreamReader(uplSOWDoc.FileContent, Encoding.Unicode);
string sowText = sreader.ReadToEnd();
sowLiteral.Text = ConvertToASCII(sowText);
lblUploadResults.Text = "File loaded successfully.";
}
else
lblUploadResults.Text = "Upload failed. Just text or html files are allowed.";
}
catch(Exception ex)
{
lblUploadResults.Text = ex.Message;
}
}
}
private string ConvertToASCII(string source)
{
if (source.IndexOf('\u2013') > -1) source = source.Replace('\u2013', '-');
if (source.IndexOf('\u2014') > -1) source = source.Replace('\u2014', '-');
if (source.IndexOf('\u2015') > -1) source = source.Replace('\u2015', '-');
if (source.IndexOf('\u2017') > -1) source = source.Replace('\u2017', '_');
if (source.IndexOf('\u2018') > -1) source = source.Replace('\u2018', '\'');
if (source.IndexOf('\u2019') > -1) source = source.Replace('\u2019', '\'');
if (source.IndexOf('\u201a') > -1) source = source.Replace('\u201a', ',');
if (source.IndexOf('\u201b') > -1) source = source.Replace('\u201b', '\'');
if (source.IndexOf('\u201c') > -1) source = source.Replace('\u201c', '\"');
if (source.IndexOf('\u201d') > -1) source = source.Replace('\u201d', '\"');
if (source.IndexOf('\u201e') > -1) source = source.Replace('\u201e', '\"');
if (source.IndexOf('\u2026') > -1) source = source.Replace("\u2026", "...");
if (source.IndexOf('\u2032') > -1) source = source.Replace('\u2032', '\'');
if (source.IndexOf('\u2033') > -1) source = source.Replace('\u2033', '\"');
byte[] sourceBytes = Encoding.Unicode.GetBytes(source);
byte[] targetBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, sourceBytes);
char[] asciiChars = new char[Encoding.ASCII.GetCharCount(targetBytes, 0, targetBytes.Length)];
Encoding.ASCII.GetChars(targetBytes, 0, targetBytes.Length, asciiChars, 0);
string result = new string(asciiChars);
return result;
}
また、前に言ったように、単語 doc に番号付けされたインデントがある場所に対応しているように見える「透明な」文字がいくつかあります。それらのユニコード値をキャプチャしてそれらを置き換える方法がわかりません....ヒント、教えてください。
よろしくお願いします!