갈루아의 반서재

Strings, bytes, runes and characters in Go


유니코드 표준은 단일값으로 표현되는 아이템에 대해 "code point" 라는 용어를 사용한다. 코드포인트 U+2318 은 hexadecimal 값 2318을 갖고 ⌘ 기호로 표현된다(더욱 자세한 내용은 Unicode page 참조). 다른 예를 들어보면, 유니코드 코드 포인트 U+0061 은 LATIN SMALL LETTER A 인 a이다. 

그러면 다음과 같은 억음 부호 'A', à 는 어떤가? 물론 문자이고, 코드 포인트 U+00E0 를 갖는다.

하지만, 다르게 볼 수도 있다. 아래의 억음 부호 코드 포인트 U+0300 에 U+0061 인 소문자 a를 덧붙인 것으로 말이다. 

일반적으로 문자는 얼마간의 서로 다른 코드 포인트의 서열로 표현된다. 따라서 서로 다른 UTF-8 바이트를 갖는다. 컴퓨팅에 있어서 문자의 개념은 그로인해 다소 모호하거나, 최소한 혼란스럽다. 따라서 이를 다룰 때는 주의를 기울여야 한다. 이를 방지하기 위해, 주어진 문자가 항상 같은 코드 포인트를 갖도록 정규화하는 기법이 존재한다. 

"Code point" 를 간단하게 Go 에서는 rune 이라는 용어를 사용한다. 라이브러리나 소스코드에 등장하는 rune 은 코드 포인트와 정확히 같은 의미이다. 

Go 언어는 rune 이라는 단어를 int32 타입의 별칭으로 정의하기도 한다. 그로인해 프로그램은 정수값이 코드포인트를 나타내는 편이 명확하다. 

⌘ 의 타입과 값은 정수값 0x2318 을 갖는 rune 이다. 


요약하자면 중요한 내용은 다음과 같다. 

  • Go 소스코드는 항상 UTF-8 이다.

  • 문자열은 임의의 바이트를 가진다.

  • 문자 리터럴은 유효한 UTF-8 시퀀스를 가진다. .

  • 이러한 시퀀스는 소위 rune 이라는 유니코드 코드 포인트를 나타낸다.

  • 문자열의 문자가 정규화되어있다는 보장은 없다.