비 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은 원래 문자를 나타낼 수 있으므로 변환 중에 사용됩니다. encoderReporportingFallback을 사용하여 ASCII가 아닌 문자를 빈 문자열로 변환합니다.

나는 Monscamus가 의미한다고 생각합니다.

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

벗기지 않고 실제로는 비 에한이지 않은 캐릭터로 강조된 라틴어를 변환하려면이 질문을 살펴보십시오. 8 비트 문자를 7 비트 문자로 어떻게 변환합니까? (예 : ü)

에서 영감을 받다 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();
}

이것은 테스트되지 않은 코드입니다.

Regex가 필요하지 않습니다. 인코딩 만 사용합니다 ...

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

데이터베이스에서 주석 블록을 구문 분석하는 데 유용한 다음 약간 변경된 범위를 발견했습니다. 즉, CSV 필드가 화를내는 탭과 탈출 문자로 경쟁 할 필요가 없습니다.

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

다른 특수 문자 또는 특정 구두점 검사를 피하려면 ASCII 테이블

나는 확장 된 ASCII 캐릭터를위한 솔루션을 찾고 있었지만 찾을 수는 없었습니다. 내가 찾은 가장 가까운 것은입니다 BZLM의 솔루션. 그러나 이는 ASCII 코드에서만 127까지 작동합니다 (분명히 코드의 인코딩 유형을 대체 할 수 있지만 이해하기가 약간 복잡하다고 생각합니다. 따라서이 버전을 공유합니다). 다음은 작동하는 솔루션입니다 확장 된 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 생성자는 더 이상 사용하지 않습니다.

나는이 REGEX 표현을 사용했습니다.

    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