261

文字列から非 ASCII 文字を削除するにはどうすればよいですか? (C#)

4

12 に答える 12

451
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
于 2008-09-23T19:46:24.453 に答える
149

正規表現を使用しない純粋な .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 文字を空の文字列に変換します。

于 2008-09-25T19:32:16.687 に答える
16

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

于 2012-04-05T22:30:39.243 に答える
13

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();
}

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

于 2010-01-27T19:00:39.260 に答える
6

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

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
于 2013-06-18T17:38:53.383 に答える
5

拡張 ASCII 文字の解決策を探してここに来ましたが、見つかりませんでした。私が見つけた最も近いものはbzlm's solutionです。しかし、それは127までのASCIIコードに対してのみ機能します(明らかに、彼のコードのエンコーディングタイプを置き換えることができますが、理解するのは少し複雑だったと思います。したがって、このバージョンを共有します)。拡張ASCIIコード、つまりISO 8859-1である最大255で機能するソリューションを次に示します

非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:

これがコードの実用的なフィドルです

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

于 2016-10-11T21:38:52.630 に答える
4

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

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

他の特殊文字や特定の句読点を避けたい場合は、ASCII テーブルを確認してください

于 2012-10-01T10:02:56.900 に答える
2

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

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

欠点は、すべての「生き残った」文字が最初に型の配列に入れられ、コンストラクターがそれを使用しなくなっchar[]た後に破棄されることです。string

于 2013-09-03T17:08:42.887 に答える