본문 바로가기
C#

[C#] Encoding

by DANEW 2023. 6. 30.

Encoding (System.Text.Encoding)

 

Encoding Class (System.Text)

Represents a character encoding.

learn.microsoft.com

 
[System.Runtime.InteropServices.ComVisible(true)] public abstract class Encoding : ICloneable

 

텍스트 부호화와 유니코드

- 문자 집합은 일단의 문자들에 수치 부호(부호점)를 부여한 것. 주로 유니코드와 ASCII를 사용.

- .NET의 형식 체계는 유니코드에 맞게 되어 있음

 

- 텍스트 부호화는 문자의 수치 부호점을 그 이진 표현으로 대응시키는 것

- .NET에서는 주로 텍스트 파일이나 스트림을 다루는데 중요하게 쓰임.

 

1. 유니코드 문자를 다른 문자 집합에 대응시키는 부호화

- EBCDIC, ASCII, GB18030 등

 

2. 표준 유니코드 부호화 방식을 사용하는 부호화

- UTF-8, UTF-16(UNICODE), UTF-32, UTF-7 등

 

UTF-8: 한 문자를 8비트 워드 - 최소 1바이트, 최대 4바이트로 표현.

        .NET 스트림 입출력의 기본 부호화, 거의 모든 부호화 형식의 기본, 텍스트 파일이나 스트림에서 가장 인기 있음

UTF-16: 한 문자를 16비트 워드 - 2바이트나 4바이트로 표현. 

        .NET 내부에서 문자와 문자열을 표현하는데 사용

UTF-32: 한 문자를 32비트 워드 - 4바이트로 표현

       공간 효율성이 낮아 거의 쓰이지 않으나 모든 문자가 같은 수의 바이트를 차지해 임의 접근이 쉬움

 

Encoding 객체 얻기

- GetEncoding, GetEncodings

- 파생 클래스를 직접 인스턴스화 - 예외 던짐 설정, 엔디안 방식, 바이트 순서 표식 설정 가능

 

파일 및 스트림 입출력에 대한 Encoding 객체

- 예제 참고

 

바이트 배열에 대한 Encoding 객체

- GetBytes, GetString

 

UTF-16과 유니코드 대체 쌍

- char가 2바이트이기 때문에 유니코드 상 BMP 밖의 2워드 문자를 표현하는데 문제가 생길 수 있음

- 대체 쌍(surrogate pair)를 사용하여 표현

- 변환: ConvertFromUtf32, ConvertToUtf32

- 식별: IsSurrogate, IsHighSurrogate, IsLowSurrogate, IsSurrogatePair

- System.Globalization의 StringInfo 클래스도 2워드 문자를 다루는 메서드와 속성 제공

 

// Encoding - 텍스트 부호화를 캡슐화하는 클래스들의 공통 기반 형식

 

// Encoding 객체 얻기

 

// GetEncoding을 통해서 얻기

Encoding chinese = Encoding.GetEncoding("GB18030");

반응형

// 흔히 쓰이는 부호화는 정적 속성으로도 얻을 수 있음

Encoding utf8 = Encoding.UTF8;

Encoding utf16 = Encoding.Unicode;

Encoding utf32 = Encoding.UTF32;

Encoding ascii = Encoding.ASCII;

 

// 지원되는 모든 부호화 방식의 목록 출력(표준 IANA)

foreach (var item in Encoding.GetEncodings())

{

    Console.WriteLine(item.Name);

}

Console.WriteLine();

 

// Encoding 파생 클래스를 직접 인스턴스화

// 여러가지 옵션을 선택할 수 있는 장점이 있음

// 예제가 없네...

 

 

// 파일 및 스트림 입축력에 대한 Encoding 객체

// 마지막 인수 생략시 기본값인 UTF-8 부호화를 적용

System.IO.File.WriteAllText("data.txt", "Testing...", utf16);

 

 

// 바이트 배열에 대한 Encoding 객체

string str = "0123456789";

 

// 스트링을 byte[]로 변환

byte[] utf8Bytes = utf8.GetBytes(str);

byte[] utf16Bytes = utf16.GetBytes(str);

byte[] utf32Bytes = utf32.GetBytes(str);

 

Console.WriteLine(utf8Bytes.Length);

Console.WriteLine(utf16Bytes.Length);

Console.WriteLine(utf32Bytes.Length);

 

// byte[]를 스트링으로 변환

string str1 = utf8.GetString(utf8Bytes);

string str2 = utf16.GetString(utf16Bytes);

string str3 = utf32.GetString(utf32Bytes);

 

Console.WriteLine(str1);

Console.WriteLine(str2);

Console.WriteLine(str3);

 

 

// UTF-16과 유니코드 대체 쌍

// 대부분의 글자는 2바이트로 표현 가능하지만 4바이트 문자도 필요한 경우가 있음

// 고대 언어 문자, 음악 표기용 기호들, 자주 쓰이지 않는 한자 등

 

// 변환: ConvertFromUtf32, ConvertToUtf32

// 식별: IsSurrogate, IsHighSurrogate, IsLowSurrogate, IsSurrogatePair

 

// System.Globalization StringInfo 클래스도 2워드 문자를 다루는 메서드와 속성 제공

반응형

'C#' 카테고리의 다른 글

[C#] TimeZoneInfo  (1) 2023.08.11
[C#] TimeZone  (1) 2023.08.10
[C#] DateTime & DateTimeOffset  (0) 2023.07.06
[C#] TimeZoneInfo  (2) 2023.07.05
[C#] TimeZone  (1) 2023.07.04
[C#] TimeSpan  (1) 2023.07.01
[C#] StringBuilder  (0) 2023.06.27
[C#] string  (0) 2023.06.25