prosource

에서 인쇄할 수 없는 문자를 검색하려면 어떻게 해야 합니까?NET?

probook 2023. 5. 8. 22:19
반응형

에서 인쇄할 수 없는 문자를 검색하려면 어떻게 해야 합니까?NET?

저는 단지 에 방법이 있는지 궁금합니다.문자가 인쇄 가능한지 여부를 확인하는 NET 2.0 - 다음과 같은 기능isprint(int)표준 C부터

찾았습니다Char.IsControl(Char).

그것을 이 목적으로 사용할 수 있습니까?

사용할 수 있습니다.그것이 제가 사용하는 것입니다.당신은 절대로 그것을 사용하고 싶지 않습니다.<0x20모든 비라틴 문자와 대부분의 비영어 문자가 127보다 클 것이기 때문입니다.

인쇄 가능하다는 것은 빈 공간(흰색 공간)이라도 렌더링을 의미하는 경우 [네거티브]만으로는 문자가 인쇄 가능한지 여부를 결정하기에 충분하지 않습니다.

  • 1바이트로도 충분하지 않습니다.U+0000-U+00FF공백 문자 이외의 ASCII 공백 문자도 제어 문자로 분류되므로 유니코드 범위(ASCII / ISO-8859-1과 호환됨),Char.IsControl('\t')그리고.Char.IsControl('\n')보고도 참입니다.

  • 단일 바이트 범위 외에도 렌더링하지 않는 문자의 다른 범주를 인식해야 합니다.


단일 바이트 - 유니코드 범위(ASCII/ISO-8859-1과 호환됨)에 대한 솔루션:

  // Sample input char.
  char c = (char)0x20; // space

  var isPrintable = ! Char.IsControl(c) || Char.IsWhiteSpace(c);

모든 유니코드 문자대한 솔루션의 근사치:

안타깝게도 완벽한 솔루션은 없습니다.

  • 의 근본적인 한계Char-기반 테스트가 그 유형입니다.Char코드 포인트까지의 문자만 나타낼 수 있습니다.U+FFFF즉, 이른바 BMP(기본 다중 언어 평면)의 문자만 사용할 수 있습니다.코드 포인트가 높은 BMP 외부의 문자는 두 로 표시되어야 합니다. Char인스턴스(이른바 대리 쌍)입니다.

  • UnicodeCategory.PrivateUse이름에서 알 수 있듯이 문자 범주가 표준화되지 않았습니다. 예를 들어,U+F8FFMacOS에서는 Apple 기호가 포함되어 있지만 Windows에서는 정의되지 않았습니다.따라서 인쇄 가능한 문자가 포함되어 있을 수 있으며 인쇄 가능 여부를 동적으로 결정해야 합니다.

  • UnicodeCategory.Format범주에는 대부분 문자가 포함되어 있지만 예외가 있습니다. 이 표를 참조하십시오.

    • 유니코드 표준의 지정된 버전에 대해 이러한 예외를 하드 코딩할 수 있지만, 이는 번거롭고 시간이 지남에 따라 더 이상 사용되지 않을 수 있습니다.

따라서, 다음 코드는 의 모든 문자가UnicodeCategory.PrivateUse그리고.UnicodeCategory.Format인쇄할 수 있습니다. 즉, 일부 문자는 잘못 분류됩니다.

using System;
using System.Linq;
using System.Globalization;

// ...

  // Sample input char.
  char c = (char)0x20; // space

  // The set of Unicode character categories containing non-rendering,
  // unknown, or incomplete characters.
  // !! Unicode.Format and Unicode.PrivateUse can NOT be included in
  // !! this set, because they may (private-use) or do (format)
  // !! contain at least *some* rendering characters.
  var nonRenderingCategories = new UnicodeCategory[] {
    UnicodeCategory.Control,
    UnicodeCategory.OtherNotAssigned,
    UnicodeCategory.Surrogate };

  // Char.IsWhiteSpace() includes the ASCII whitespace characters that
  // are categorized as control characters. Any other character is
  // printable, unless it falls into the non-rendering categories.
  var isPrintable = Char.IsWhiteSpace(c) ||
    ! nonRenderingCategories.Contains(Char.GetUnicodeCategory(c));

▁▁additionChar.IsControlChar()주어진 문자 값이 어떤 범주인지 결정하는 데 사용할 수 있는 다른 함수는 다음과 같습니다.

  • IsLetter()
  • IsNumber()
  • IsDigit()
  • IsLetterOrDigit()
  • IsSymbol()
  • IsPunctuation()
  • IsSeparator()
  • IsWhiteSpace()

"기존 ASCII 텍스트" 파일을 사용하고 제공된 기능을 사용하려면 다음과 같이 표현합니다.

(Char.IsLetterOrDigit(ch) || Char.IsPunctuation(ch) || Char.IsSymbol(ch) || (ch==' '))

작동해야 합니다.

유니코드를 사용하는 경우 캔이나 웜을 엽니다.심지어 그 시대에도, 공간이 인쇄 가능한지 아닌지는 해석의 여지가 있었습니다.isprint()그리고.isgraph()함수)를 선택합니다.인쇄 가능한 유니코드 문자에 대한 관련 질문과 답변을 참조하십시오.

private bool IsPrintableCharacter(char candidate)
{
    return !(candidate < 0x20 || candidate > 127);
}

언급URL : https://stackoverflow.com/questions/3253247/how-do-i-detect-non-printable-characters-in-net

반응형