developer tip

.net은 string에 UTF16 인코딩을 사용하지만 파일 저장을 위해 utf8을 기본값으로 사용하는 이유는 무엇입니까?

optionbox 2020. 12. 5. 09:40
반응형

.net은 string에 UTF16 인코딩을 사용하지만 파일 저장을 위해 utf8을 기본값으로 사용하는 이유는 무엇입니까?


여기에서

기본적으로 문자열은 UTF-16 문자 인코딩 형식을 사용합니다.

그러나 StreamWriter 와 저장할 때 :

이 생성자는 BOM (Byte-Order Mark)없이 UTF-8 인코딩을 사용하여 StreamWriter를 만듭니다.

이 샘플을 보았습니다 (깨진 링크 제거됨).

여기에 이미지 설명 입력

그리고 utf8일부 문자열에서는 utf-16더 작고 다른 문자열에서는 더 작은 것처럼 보입니다 .

  • 그렇다면 .net은 파일을 저장 utf16하는 동안 문자열의 기본 인코딩으로 사용 하는 이유는 무엇 utf8입니까?

감사합니다.

추신 Ive는 이미 유명한 기사를 읽었습니다 .


서로 게이트 쌍 (또는 앱에 기본 다국어 평면 외부의 문자가 필요할 가능성)을 무시하고 만족 한다면 UTF-16은 기본적으로 항상 코드 단위당 2 바이트를 요구하고 모든 BMP 문자를 각각 하나의 코드 단위.

원시 유형을 고려하십시오 char. 메모리 내 표현으로 UTF-8을 사용하고 모든 유니 코드 문자 를 처리하려면 얼마나 커야합니까? 최대 4 바이트가 될 수 있습니다. 즉, 항상 4 바이트를 할당해야합니다. 이 시점에서 우리는 UTF-32를 사용하는 것이 좋습니다!

물론 char표현 으로 UTF-32를 사용할 수 있지만 표현에는 UTF-8을 사용하여 string이동하는대로 변환합니다.

UTF-16의 두 가지 단점은 다음과 같습니다.

  • 모든 문자 BMP에있는 것은 아니기 때문에 유니 코드 문자 당 코드 단위 수는 가변적 입니다. 그림 이모티콘이 인기를 끌기 전까지는 일상적인 사용에서 많은 앱에 영향을 미치지 않았습니다. 요즘 메시징 앱 등의 경우 UTF-16을 사용하는 개발자는 실제로 서로 게이트 쌍에 대해 알아야합니다.
  • 일반 ASCII (많은 텍스트가 적어도 서쪽에 있음)의 경우 동등한 UTF-8 인코딩 텍스트보다 두 배의 공간을 차지합니다.

(부수적으로, 필자는 Windows가 유니 코드 데이터에 UTF-16을 사용한다고 믿고 있으며 .NET이 interop 이유로이를 따르는 것이 합리적이라고 생각합니다. 그래도 질문은 한 단계로 진행됩니다.)

서로 게이트 쌍의 문제를 감안할 때 언어 / 플랫폼이 interop 요구 사항없이 처음부터 설계 되었다면 (그러나 유니 코드로 텍스트 처리를 기반으로 함) UTF-16이 최선의 선택이 아닐 것입니다. UTF-8 (메모리 효율성을 원하고 n 번째 문자를 얻는 데있어 약간의 처리 복잡성을 신경 쓰지 않는 경우) 또는 UTF-32 (반대면)가 더 나은 선택이 될 것입니다. (n 번째 문자에 도달하는 것조차도 다른 정규화 형식과 같은 것들로 인해 "문제"가 있습니다. 텍스트는 어렵습니다 ...)


많은 "이것이 선택된 이유"질문과 마찬가지로 이것은 역사에 의해 결정되었습니다. Windows는 1993 년에 핵심적인 유니 코드 운영 체제가되었습니다. 당시 유니 코드는 여전히 65535 개의 코드 포인트의 코드 공간 만 가지고있었습니다. 요즘에는 UCS라고합니다. 1996 년이 되어서야 유니 코드가 코딩 공간을 백만 개의 코드 포인트로 확장하기위한 보조 평면을 획득했습니다. 그리고 서로 게이트 쌍을 16 비트 인코딩에 맞추고 utf-16 표준을 설정합니다.

.NET 문자열은 운영 체제 인코딩에 매우 적합하기 때문에 utf-16이며 변환이 필요하지 않습니다.

utf-8의 역사는 더 어둡습니다. 확실히 Windows NT를 지난 RFC-3629는 1993 년 11 월부터 시작되었습니다. 발판을 마련하는 데 시간이 오래 걸렸고 인터넷이 도구였습니다.


UTF-8은 대부분의 언어에서 상대적으로 압축 된 형식이므로 텍스트 저장 및 전송의 기본값입니다 (일부 언어는 UTF-8보다 UTF-16에서 더 압축됩니다). 각 특정 언어에는 더 효율적인 인코딩이 있습니다.

UTF-16은 유니 코드 문자 클래스 및 기타 테이블에 직접 구문 분석하고 매핑하는 것이 문자 당 더 빠르기 때문에 메모리 내 문자열에 사용됩니다. Windows의 모든 문자열 함수는 UTF-16을 사용하며 수년 동안 사용합니다.

참고 URL : https://stackoverflow.com/questions/14942092/why-does-net-uses-the-utf16-encoding-for-string-but-uses-utf8-as-default-for

반응형