에서 인쇄할 수 없는 문자를 검색하려면 어떻게 해야 합니까?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+F8FF
MacOS에서는 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
'prosource' 카테고리의 다른 글
첫 번째 항목이 "ID"인 CSV 파일이 Excel에서 손상되었습니다. (0) | 2023.05.08 |
---|---|
LINQ - 전체 외부 결합 (0) | 2023.05.08 |
Azure 웹 페이지 배포에서 폰타썸을 작동시키는 방법은 무엇입니까? (0) | 2023.05.08 |
Git를 사용하여 더티 인덱스 또는 추적되지 않은 파일 확인 (0) | 2023.05.08 |
Excel VBA에서 "!="와 동등한 것은 무엇입니까? (0) | 2023.05.08 |