以下の私の投稿では、カーリー引用符とは何か、なぜ私のアプリはそれらで動作しないのかを尋ねました。私の質問は、私のプログラムがそれらに出くわしたときにどのようにそれらを置き換えることができるかです.C#でこれを行うにはどうすればよいですか? 彼らは特殊文字ですか?
ありがとう
以下の私の投稿では、カーリー引用符とは何か、なぜ私のアプリはそれらで動作しないのかを尋ねました。私の質問は、私のプログラムがそれらに出くわしたときにどのようにそれらを置き換えることができるかです.C#でこれを行うにはどうすればよいですか? 彼らは特殊文字ですか?
ありがとう
問題のある単語の文字のより広範なリスト
if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-');
if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-');
if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-');
if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_');
if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\'');
if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\'');
if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ',');
if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\'');
if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"');
if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"');
if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"');
if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "...");
if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\'');
if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"');
この問題に遭遇したとき、私は C# で String クラスに拡張メソッドを書きました。
public static class StringExtensions
{
public static string StripIncompatableQuotes(this string s)
{
if (!string.IsNullOrEmpty(s))
return s.Replace('\u2018', '\'').Replace('\u2019', '\'').Replace('\u201c', '\"').Replace('\u201d', '\"');
else
return s;
}
}
これは単に、ばかげた「スマート クォート」を通常のクォートに置き換えるだけです。
[編集] 「ダブル スマート クォート」の置換もサポートするように修正しました。
Nick van Esch の人気のある回答を拡張するために、コメント内の文字の名前を含むコードを次に示します。
if (buffer.IndexOf('\u2013') > -1) buffer = buffer.Replace('\u2013', '-'); // en dash
if (buffer.IndexOf('\u2014') > -1) buffer = buffer.Replace('\u2014', '-'); // em dash
if (buffer.IndexOf('\u2015') > -1) buffer = buffer.Replace('\u2015', '-'); // horizontal bar
if (buffer.IndexOf('\u2017') > -1) buffer = buffer.Replace('\u2017', '_'); // double low line
if (buffer.IndexOf('\u2018') > -1) buffer = buffer.Replace('\u2018', '\''); // left single quotation mark
if (buffer.IndexOf('\u2019') > -1) buffer = buffer.Replace('\u2019', '\''); // right single quotation mark
if (buffer.IndexOf('\u201a') > -1) buffer = buffer.Replace('\u201a', ','); // single low-9 quotation mark
if (buffer.IndexOf('\u201b') > -1) buffer = buffer.Replace('\u201b', '\''); // single high-reversed-9 quotation mark
if (buffer.IndexOf('\u201c') > -1) buffer = buffer.Replace('\u201c', '\"'); // left double quotation mark
if (buffer.IndexOf('\u201d') > -1) buffer = buffer.Replace('\u201d', '\"'); // right double quotation mark
if (buffer.IndexOf('\u201e') > -1) buffer = buffer.Replace('\u201e', '\"'); // double low-9 quotation mark
if (buffer.IndexOf('\u2026') > -1) buffer = buffer.Replace("\u2026", "..."); // horizontal ellipsis
if (buffer.IndexOf('\u2032') > -1) buffer = buffer.Replace('\u2032', '\''); // prime
if (buffer.IndexOf('\u2033') > -1) buffer = buffer.Replace('\u2033', '\"'); // double prime
あなたが持っているのは本質的に破損したCSVファイルであることに注意してください。すべてのタイポグラファーの引用符を無差別に単純な引用符に置き換えても、必ずしもファイルが修正されるとは限りません。ご存じのとおり、タイポグラファーの引用の一部は、フィールドの値の一部として存在するはずでした。それらを引用符で置き換えても、有効な CSV ファイルが得られない可能性があります。
あなたが説明した方法で破損しているファイルを修正するアルゴリズム的な方法はないと思います。最初にこのような無効なファイルがどのように作成されたのかを調査し、それを停止することに時間を費やした方がよい場合があります。たとえば、だれかが Word を使用してデータ ファイルを編集していませんか?
私は、まさにこれを行う、非常に大きな... プログラムを持っています。スクリプトを切り取って、自由に使用できます。あらゆる種類の置換を行い、http://bitbucket.org/nesteruk/typografixにあります。
Windows に付属の Character Map アプリケーションによると、中引用符の Unicode 値は 0x201c と 0x201d です。これらの値をストレート クォーテーション 0x0022 に置き換えれば、準備完了です。
String.Replace(0x201c, '"');
String.Replace(0x201d, '"');
これを行うプログラムもあります。ソースはCP-1252Fixerのこのファイルにあります。さらに、すべてのフォーマットを保持しながら、RTF文字列内の文字を変換するためのいくつかのマッピングを定義します。これは、一部のユーザーにとって役立つ場合があります。
また、すべての「スマートクォート」文字を、対応する低ASCII文字、エンティティコード、および文字参照に完全にマッピングします。
上記が機能しない場合は、スマートな一重引用符でこれを試してください。
string.Replace("\342\200\230", "'")
string.Replace("\342\200\231", "'")
スマートな二重引用符についてもこれを試してください。
string.Replace("\342\200\234", '"')
string.Replace("\342\200\235", '"')