2012-02-06 9 views
22

업데이트 질문은 유니 코드 버전이나 버전의 .NET 플랫폼에서 지원되는 문자 클래스, 비교, 분류, 표준화 및 데이터 정렬에 관해서문자 클래스와 관련하여 어떤 .NET 플랫폼 및 Windows 버전에서 지원되는 유니 코드 버전은 무엇입니까?

를 ¹?

원래의 질문에

내가 다소 막연 .NET 유니 코드 버전 3.0을 지원한다는 내부 UTF-16 인코딩 정말 UTF-16 아님을 읽은 기억하지만 실제로하지 않은, UCS-2 사용 같은.

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

을 그리고 문자열 "ᵽ9"를 저장 : U + FFFF 위의 문자 즉 고려 수없는 것으로, 예를 들어 보인다.

나는 기본적으로 다음과 같은 답변의 최종 참조를 찾고 있어요 :

  • 를 그렇지 않으면 진정한 UTF-16 .NET에서, 그것은 무엇인가?
  • .NET에서 지원되는 유니 코드 버전은 무엇입니까?
  • 가까운 장래에 최신 버전이 지원되지 않거나 계획되지 않은 경우 누구에게 (상용) 라이브러리가 있는지 또는이 문제를 해결할 수있는 방법을 알고 있습니까? 나는 시간이 지날와 같은 질문을 업데이트

¹)는,이 답변과 더 큰 지역 사회에 대한 더 적절한 것 같다. 나는 원래의 질문을 남긴 부분이 주석 부분에서 답을 얻었습니다. 또한 오래된 UCS-2 (대용 물 없음)는 지금의 고대 32 비트 Windows 버전에서 사용되었으며 .NET은 항상 내부에서 UTF-16 (대용 물 포함)을 사용했습니다.

+1

정확히 그 캐릭터로 무엇을하려합니까? ASP.NET과 함께 웹 페이지에 넣으시겠습니까? WPF 또는 WinForms 인터페이스에 표시 하시겠습니까? –

+2

이 문맥에서 "작동하지 않는 것"은 무엇을 의미합니까? – Gabe

+0

@JoeStrommen : 우리는 새로운 XML 기반 데이터 변환 도구 세트를 구현하고 있으며, "우리는 6.0까지의 유니 코드를 지원합니다"라고 말할 수 있는지 또는 다른 것을 말할 필요가 있는지 여부를 알아 내려고하고 있습니다. 또한 .NET에서 가능한 제한 사항을 무시할 수있는 방법을 찾으려고합니다. – Abel

답변

16

내부적으로 .NET은 UTF-16입니다. 일부 경우, 예를 들어 ASP.NET이 응답에 쓰면 기본적으로 UTF-8이 사용됩니다. 둘 다 더 높은 비행기를 다룰 수 있습니다.

사람들이 .NET을 UCS2로 참조하는 이유는 Char가 엄격하게 16 비트이고 단일 Char가 위쪽 평면을 나타내는 데 사용할 수 없다는 (I 은 다른 이유가 있기 때문에라고 생각하기 때문입니다.) 그러나 Char에는 문자열 내부의 상위 평면 UTF-16 문자에서 작동 할 수있는 정적 메서드 오버로드 (예 : Char.IsLetter)가 있습니다. 문자열은 실제 UTF-16으로 저장됩니다.

대문자 인 \U을 사용하여 높은 유니 코드 코드 포인트를 직접 지정할 수 있습니다. "\U0001D7D9" - 다시 한번 말하지만 문자열 내부 만, 문자가 아닙니다. 유니 코드 버전으로

, from the MSDN documentation :

"은 .NET Framework 4에서, 케이스, 정상화 및 유니 코드 문자 정보를 정렬하는 윈도우 7과 동기화되고 유니 코드 5.1 표준을 준수합니다."

업데이트 1 : 이것이 의미하는 것은 아니다, 그러나, 주목할 가치가 유니 코드 5.1의이 지원되는 전체이 - 윈도우 7도

Windows 8 targets Unicode 6.0 .NET 4.0도 - 난 .NET Framework 4.5가이 파일과 동기화 될 수 있지만이를 확인하는 출처는 없음을 알았습니다. 그리고 다시 한번, 이것이 전체 표준이 구현된다는 것을 의미하지는 않습니다.

업데이트 2 :This note on Roslyn는 기본 플랫폼 컴파일러에 대한 유니 코드 지원을 정의하고, link to the code으로는 C# 6.0 (결과적으로 C#을 식별자에 대한 주요 변경 포함)까지 유니 코드 6.0을 지원한다고 설명 있음을 확인합니다.

업데이트 3 : .NET 버전 4.5 new class SortVersion 이후는 정적 속성 SortVersion.FullVersion를 호출하여 지원 유니 코드 버전을 도입한다. the same page에서 Microsoft는 .NET 4.0이 모든 플랫폼에서 유니 코드 5.0을 지원하고 .NET 4.5가 Windows 7에서 유니 코드 5.0을 지원하고 Windows 8에서 유니 코드 6.0을 지원한다고 설명합니다.이 버전은 각각 버전 5.x와 6.0을 말하는 the official "what is new" statement here과 약간 다릅니다. 내 자신의 (편집자 : 아벨) 경험에 따르면 대부분의 경우 .NET 4.0에서는 유니 코드 5.1이 문자 클래스에서 지원되지만 필자는 정렬, 정규화 및 데이터 정렬을 테스트하지 않았습니다. 이것은 위에서 인용 한 바와 같이 MSDN에서 말한 내용과 일치합니다.

+1

'char'에 대한 좋은 관찰. 실제로'char uni = "\ U0002B740".ToCharArray() [0];은 UTF-16 서로 게이트 쌍 중 절반에 불과한 "55405"를 보여줍니다. Char.IsLetter를''\ u0526' (잘못)하면 유니 코드 6에서만 소개 되었기 때문에'false'를 보여줍니다. – Abel

+1

(찾고있는 참조를 보여 주었기 때문에 이것을 받아들이는데 너무 바보 같아서 찾을 수 없습니다. at는 확실한 위치이지만 다른 답변은 그 자체로 가치가 있습니다.) – Abel

+1

이것은 단일 문자에 대한 정보를 얻는 데 도움이 될 수 있습니다. [MSDN link] (http://msdn.microsoft.com/en- us/library/system.globalization.stringinfo.aspx). char는 한 개 이상의 반을 포함 할 수 없으므로 StringInfo 메서드는 완전한 UTF-16 쌍 (문자 *가 쌍인 경우 문자열을 반환합니다. 그렇지 않으면 단일 문자를 문자열로 반환하거나 문자 + 결합 발음 구별 기호 결합 용 문자). – JimmiTh

4

MSDN 간단히 여기에 대해 설명합니다

http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx 내가이 시도 :

static void Main(string[] args) { 
     string someText = char.ConvertFromUtf32(0x1D7D9); 
     using (var stream = new MemoryStream()) { 
      using (var writer = new StreamWriter(stream, Encoding.UTF32)) { 
       writer.Write(someText); 
       writer.Flush(); 
      } 
      var bytes = stream.ToArray(); 
      foreach (var oneByte in bytes) { 
       Console.WriteLine(oneByte.ToString("x")); 
      } 
     } 
    } 

를 그리고 정확한 BOM 및 u1D7D9 코드 포인트 그 \ 의 올바른 표현을 포함한 바이트 배열의 덤프를 가지고,

  • UTF8
  • UTF 이러한 인코딩을위한 32
  • 유니 코드 (UTF-16)

그래서 내 생각이 더 높은 비행기가 지원되는지, 그리고 그 UTF-16은 정말 UTF-16 (그리고 UCS-2)

+0

쉬운 접근 방식을 보여 주셔서 감사합니다. 그것은 실제로 UTF-16이 아닌 UCS-2 (더 이상)가 아닌 것 같습니다. 문자와 모든 인코딩은 다음과 같습니다. http://www.fileformat.info/info/unicode/char/1d7d9/index.htm – Abel

+0

Btw, 해당 참조를 읽었지만 지원되는 버전에 대한 확실한 정보를 찾지 못했습니다. 유니 코드. – Abel

5
입니다

해당 문자가 지원됩니다.

string text = "\U0001D7D9"

당신이에서 해당 문자와 ​​WPF 응용 프로그램을 만드는 경우 :주의 할 점은 2 개 이상의 바이트 유니 코드 문자를,이 같은 대문자 '\ U'로 선언해야한다는 것입니다 텍스트 블록을 사용하면 이중 1 문자를 완벽하게 렌더링해야합니다.

+1

한 가지 더 :> 2 바이트 문자가 문자열로 표현되는 방법에 대한 설명은 http://msdn.microsoft.com/en-us/library/aa664669(v=vs.71).aspx를 참조하십시오. –

0

.NET 프레임 워크 4.6 및 4.5 4 3.5 및 3.0 - 유니 코드 표준 버전 5.0 .NET 프레임 워크 2.0 및 1.1 - 유니 코드 표준, 버전 3.1

전체 답변 here 찾을 수 있습니다 비고 섹션 아래

+0

원본 답변에 대한 편집 내용을 확인하십시오. MSDN 페이지에서 제안한 내용과 다릅니다. 사실,이 페이지는 문자 인코딩이나 지원되는 문자 범위와 관련하여 동일하지 않은 유니 코드 문자 범주에 대해서만 말하고 있지만 프레임 워크 버전과 기본 운영 체제간에 차이가 있습니다. 자세한 내용은 [SortVersion에 대한 MSDN 기사] (https://msdn.microsoft.com/en-us/library/system.globalization.sortversion%28v=vs.110%29.aspx)를 참조하십시오. 해당 페이지가 완료되지 않았습니다). – Abel