Encoding (System.Text.Encoding)
텍스트 부호화와 유니코드
- 문자 집합은 일단의 문자들에 수치 부호(부호점)를 부여한 것. 주로 유니코드와 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 |