文字列から非 ASCII 文字を取り除くにはどうすればよいでしょうか?(C#で)

StackOverflow https://stackoverflow.com/questions/123336

  •  02-07-2019
  •  | 
  •  

質問

文字列から非 ASCII 文字を取り除くにはどうすればよいでしょうか?(C#で)

役に立ちましたか?

解決

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

他のヒント

以下は、正規表現を使用しない純粋な .NET ソリューションです。

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

面倒に見えるかもしれませんが、直感的に操作できるはずです。.NET ASCII エンコーディングを使用して文字列を変換します。UTF8 は元の文字を表すことができるため、変換中に使用されます。EncoderReplacementFallback を使用して、非 ASCII 文字を空の文字列に変換します。

モンスカミュは次のことを言いたかったのだと思います。

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

ストリップではなく、実際にアクセント付きのラテン語をアクセントなしの文字に変換したい場合は、次の質問を見てください。 8 ビット文字を 7 ビット文字に変換するにはどうすればよいですか?(すなわち、ÜからU)

に触発された philcruz の正規表現ソリューション, 、純粋な LINQ ソリューションを作成しました。

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

これはテストされていないコードです。

正規表現は必要ありません。エンコードを使用するだけです...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

次のわずかに変更された範囲は、データベースからコメント ブロックを解析するのに便利であることがわかりました。これは、CSV フィールドを混乱させる原因となるタブ文字やエスケープ文字と競合する必要がないことを意味します。

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

他の特殊文字や特定の句読点チェックを避けたい場合 アスキーテーブル

拡張ASCII文字の解決策を探してここに来ましたが、見つかりませんでした。私が見つけた最も近いのは bzlmの解決策. 。ただし、これは 127 までの ASCII コードでのみ機能します (もちろん、コード内のエンコード タイプを置き換えることはできますが、理解するのが少し複雑だったと思います)。したがって、このバージョンを共有します)。効果的な解決策は次のとおりです 拡張 ASCII コード、つまり255まで それは ISO 8859-1

非 ASCII 文字 (255 を超える) を見つけて削除します。

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

ここにあります コードの作業用フィドル

要件に従ってエンコーディングを置き換えます。残りは同じままにする必要があります。

これはパフォーマンスの点では最適ではありませんが、非常に単純な Linq アプローチです。

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

欠点は、すべての「生き残った」文字が最初に次の型の配列に入れられることです。 char[] それはその後捨てられます string コンストラクターはもう使用しません。

次の正規表現を使用しました。

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

この正規表現を使用して、ファイル名内の不正な文字を除外します。

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

ファイル名に使用できる文字はこれだけである必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top