.NET Framework문자열


비고

.NET 문자열에서 System.StringSystem.Char 문자 시퀀스이며 각 문자는 UTF-16으로 인코딩 된 코드 단위입니다. 문자 와 .NET (및 많은 다른 언어)의 문자 언어 정의가 다르기 때문에 이러한 구분은 중요합니다.

grapheme 이라고 올바르게 명명되어야하는 한 문자글리프 로 표시되며 하나 이상의 유니 코드 코드 포인트로 정의됩니다. 각 코드 포인트는 일련의 코드 단위 로 인코딩됩니다. 이제는 단일 System.Char 이 항상 문자를 나타내지 않는 이유를 분명히해야합니다. 현실 세계에서 어떻게 다른지 살펴 보겠습니다.

  • 한 글자는 문자 결합으로 인해 두 개 이상의 코드 포인트가 생길 수 있습니다. à 두 개의 코드 포인트로 구성됩니다 : U + 0061 라틴 소문자 AU + 0300 합계 그램 액센트 . 이것은 "à".Length == 2 이기 때문에 가장 일반적인 실수입니다. 1 기대할 수 있습니다.
  • 위에서 설명한대로 예를 들어 A가 그라브 또는 두 개의 코드 포인트 단일 코드 포인트 U + 00E0 LATIN SMALL LETTER A를 할 수있다를 들어, 문자가 복제됩니다. 분명히 "\u00e0" == "\u0061\u0300" ( "\u00e0".Length != "\u0061\u0300".Length )와 같은 것을 비교해야합니다. 이는 String.Normalize() 메서드로 문자열 정규화를 수행했기 때문에 가능합니다.
  • 유니 코드 시퀀스는 합성 또는 분해 된 시퀀스를 포함 할 수 있습니다. 예를 들어, 문자 U + D55C HAN CHARACTER 는 단일 코드 포인트 (UTF-16의 단일 코드 단위로 인코딩 됨) 또는 음절의 분해 된 시퀀스 , beᆫ. 그들은 동등하게 비교되어야합니다.
  • 하나의 코드 포인트는 하나 이상의 코드 단위로 인코딩 할 수있다 : 문자 𠂊 U + 2008A HAN 문자가 두로 인코딩됩니다 System.Char ( "\ud840\udc8a" UTF-16 : 그것은 단지 하나의 코드 포인트 인 경우에도) 인코딩은 고정 크기가 아닙니다! 예를 들어 응용 프로그램이 최대 길이를 적용하고 맹목적으로 문자열을 잘라내어 잘못된 문자열을 만들 수있는 경우 이는 수많은 버그 (심각한 보안 버그)의 원인입니다.
  • 일부 언어가 소리를 나타내는 두 글자 체코 채널에서 시간 후 독립 편지 (예를과 trigraph를, 그리고 내가 문자열 목록을 주문 후시 전에 케미 전에 fyzika있을 것이다.

텍스트 처리에 관한 더 많은 문제가 있습니다 ( 예를 들어 문자 비교를 통해 유니 코드 인식 문자어떻게 수행 할 수 있습니까?). 광범위한 소개와 관련 인수에 대한 링크가 더 많습니다.

일반적으로 국제 텍스트를 다룰 때이 간단한 함수를 사용하여 문자열의 텍스트 요소를 열거 할 수 있습니다 (유니 코드 사로 게이트 및 인코딩을 중단하지 않아야 함).

public static class StringExtensions
{
    public static IEnumerable<string> EnumerateCharacters(this string s)
    {
        if (s == null)
            return Enumerable.Empty<string>();

        var enumerator = StringInfo.GetTextElementEnumerator(s.Normalize());
        while (enumerator.MoveNext())
            yield return (string)enumerator.Value;
    }
}

문자열 관련 예