저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
유니코드와 UTF-8 함수 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
우리나라에서는 한글을 많이 처리하는 만큼 유니코드와 UTF-8을 자주 사용하게 됩니다. 이번에는 유니코드와 UTF-8 함수를 사용하는 방법과 주의할 점을 알아보겠습니다.
유니코드 함수 사용하기
다음은 Unicode 패키지에서 제공하는 함수입니다.
- func Is(rangeTab *RangeTable, r rune) bool: 문자가 지정한 범위 테이블에 포함되는지 확인
- func In(r rune, ranges ...*RangeTable) bool: 문자가 여러 범위 테이블 중에 포함되는지 확인
- func IsGraphic(r rune) bool: 값이 화면에 표시될 수 있는지 확인
- func IsLetter(r rune) bool: 값이 문자인지 확인
- func IsDigit(r rune) bool: 값이 숫자인지 확인
- func IsControl(r rune) bool: 값이 제어 문자인지 확인
- func IsMark(r rune) bool: 값이 마크인지 확인
- func IsPrint(r rune) bool: 값이 Go 언어에서 출력할 수 있는지 확인
- func IsPunct(r rune) bool: 값이 문장 부호인지 확인
- func IsSpace(r rune) bool: 값이 공백인지 확인
- func IsSymbol(r rune) bool: 값이 심볼인지 확인
- func IsUpper(r rune) bool: 값이 대문자인지 확인
- func IsLower(r rune) bool: 값이 소문자인지 확인
먼저 문자가 유니코드인지 확인하는 방법입니다.
package main
import (
"fmt"
"unicode"
)
func main() {
var r1 rune = '한'
fmt.Println(unicode.Is(unicode.Hangul, r1)) // true: r1은 한글이므로 true
fmt.Println(unicode.Is(unicode.Latin, r1)) // false: r1은 라틴 문자가
// 아니므로 false
var r2 rune = '漢'
fmt.Println(unicode.Is(unicode.Han, r2)) // true: r2는 한자이므로 true
fmt.Println(unicode.Is(unicode.Hangul, r2)) // false: r2는 한글이 아니므로 false
var r3 rune = 'a'
fmt.Println(unicode.Is(unicode.Latin, r3)) // true: r3은 라틴 문자이므로 true
fmt.Println(unicode.Is(unicode.Hangul, r3)) // false: r3은 한글이 아니므로 false
fmt.Println(unicode.In(r1, unicode.Latin, unicode.Han, unicode.Hangul)) // true: r1은 한글이므로 true
}
유니코드는 전 세계 모든 문자를 표현할 수 있습니다. 따라서 문자를 종류별로 처리할 수 있도록 범위가 지정되어 있습니다. 다음은 대표적인 범위 테이블(unicode.RangeTable)입니다.
- unicode.Latin: 라틴 문자, 로마자, 영문자
- unicode.Hangul: 한글
- unicode.Han: 한자
- unicode.Hiragana, unicode.Katakana: 일본어 히라가나, 카타카나
unicode.Is 함수는 범위 테이블을 지정하여 문자가 해당 범위 테이블에 포함되는지 확인할 수 있습니다. 예제에서는 문자가 한글, 한자, 영문자인지 확인해보았습니다. 그리고 unicode.In 함수는 문자가 여러 범위 테이블 중에 포함되는지 확인할 수 있습니다.
이번에는 유니코드 문자의 특성을 확인해보겠습니다.
package main
import (
"fmt"
"unicode"
)
func main() {
fmt.Println(unicode.IsGraphic('1')) // true: 1은 화면에 표시되는 숫자이므로 true
fmt.Println(unicode.IsGraphic('a')) // true: a는 화면에 표시되는 문자이므로 true
fmt.Println(unicode.IsGraphic('한')) // true: '한'은 화면에 표시되는 문자이므로 true
fmt.Println(unicode.IsGraphic('漢')) // true: '漢'은 화면에 표시되는 문자이므로 true
fmt.Println(unicode.IsGraphic('\n')) // false: \n 화면에 표시되는 문자가 아니므로 false
fmt.Println(unicode.IsLetter('a')) // true: a는 문자이므로 true
fmt.Println(unicode.IsLetter('1')) // false: 1은 문자가 아니므로 false
fmt.Println(unicode.IsDigit('1')) // true: 1은 숫자이므로 true
fmt.Println(unicode.IsControl('\n')) // true: \n은 제어 문자이므로 true
fmt.Println(unicode.IsMark('\u17c9')) // true: \u17c9는 마크이므로 true
fmt.Println(unicode.IsPrint('1')) // true: 1은 Go 언어에서 표시할 수 있으므로 true
fmt.Println(unicode.IsPunct('.')) // true: .은 문장 부호이므로 true
fmt.Println(unicode.IsSpace(' ')) // true: ' '는 공백이므로 true
fmt.Println(unicode.IsSymbol('♥')) // true: ♥는 심볼이므로 true
fmt.Println(unicode.IsUpper('A')) // true: A는 대문자이므로 true
fmt.Println(unicode.IsLower('a')) // true: a는 소문자이므로 true
}
- unicode.IsGraphic 함수는 값이 화면에 표시될 수 있는지 확인합니다. 숫자, 영문자, 한글 등은 화면에 글꼴로 표시되므로 true를 리턴하지만 \n같은 제어 문자는 글꼴로 표시되지 않으므로 false를 리턴합니다.
- unicode.IsLetter 함수는 값이 문자인지 확인합니다. 문자라면 true, 문자가 아니라면 false를 리턴합니다.
- unicode.IsDigit 함수는 값이 숫자인지 확인합니다. 숫자라면 true, 숫자가 아니라면 false를 리턴합니다.
- unicode.IsControl 함수는 값이 제어 문자인지 확인합니다. \n같은 제어 문자는 true를 리턴하며 제어 문자가 아니라면 false를 리턴합니다.
- unicode.IsMark 함수는 값이 마크인지 확인합니다. 마크라면 true, 마크가 아니라면 false를 리턴합니다. \u17c9의 모양은 다음 주소에서 확인할 수 있습니다.
- http://www.charbase.com/17c9-unicode-khmer-sign-muusikatoan
- unicode.IsPrint 함수는 값이 Go 언어에서 출력할 수 있는지 확인합니다. 출력할 수 있으면 true, 출력할 수 없으면 false입니다.
- unicode.IsPunct 함수는 값이 문장 부호인지 확인합니다. 문장 부호라면 true, 문장 부호가 아니라면 false를 리턴합니다.
- unicode.IsSpace 함수는 값이 공백(스페이스, 탭, 개행)인지 확인합니다. 공백이라면 true, 공백이 아니라면 false를 리턴합니다.
- unicode.IsSymbol 함수는 값이 심볼인지 확인합니다. ♥같은 심볼은 true를 리턴하며 심볼이 아니라면 false를 리턴합니다.
- unicode.IsUpper, unicode.IsLower 함수는 값이 대문자 또는 소문자인지 확인합니다. 대문자 또는 소문자가 맞다면 true, 아니면 false를 리턴합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.