>백엔드 개발 >Golang >Go의 UTF 지원: 흥미로운 제한

Go의 UTF 지원: 흥미로운 제한

Susan Sarandon
Susan Sarandon원래의
2024-11-09 00:09:02218검색

Go

최근 Go의 UTF-8 지원을 살펴보며 코드에서 라틴어가 아닌 스크립트를 얼마나 잘 처리하는지 궁금했습니다.

Go 및 UTF-8

Go 소스 파일은 기본적으로 UTF-8로 인코딩됩니다. 이는 이론적으로 변수 이름, 함수 이름 등에 유니코드 문자를 사용할 수 있음을 의미합니다.

예를 들어 공식 Go 놀이터 상용구 코드에서 다음과 같은 코드를 발견할 수 있습니다.

package main

import "fmt"

func main() {
    消息 := "Hello, World!"
    fmt.Println(消息)
}

여기서 消息는 '메시지'를 뜻하는 중국어입니다. Go는 유니코드 지원 덕분에 이를 문제 없이 처리합니다. 이 기능은 Go가 중국이나 일본과 같은 국가에서 인기를 얻은 이유 중 하나입니다. 개발자는 자신의 언어에서 의미 있는 식별자를 사용하여 코드를 작성할 수 있습니다. 믿기지 않으시겠지만, 중국에서는 자국어로 코드를 작성하는 것이 큰 인기를 누리고 있고 저는 그것을 좋아합니다.


타밀어 식별자 사용 시도

자연스럽게 모국어인 타밀어로 해보고 싶었어요.

다음은 제가 작성한 간단한 예입니다.

package main

import "fmt"

func main() {
    எண்ணிக்கை := 42 // "எண்ணிக்கை" means "number"
    fmt.Println("Value:", எண்ணிக்கை)
}

얼핏 보면 오류 없이 실행될 수 있을 정도로 간단해 보입니다.

그런데 코드를 컴파일하려고 할 때 오류가 발생했습니다

./prog.go:6:11: invalid character U+0BCD '்' in identifier
./prog.go:6:17: invalid character U+0BBF 'ி' in identifier
./prog.go:6:23: invalid character U+0BCD '்' in identifier
./prog.go:6:29: invalid character U+0BC8 'ை' in identifier
./prog.go:7:33: invalid character U+0BCD '்' in identifier
./prog.go:7:39: invalid character U+0BBF 'ி' in identifier
./prog.go:7:45: invalid character U+0BCD '்' in identifier
./prog.go:7:51: invalid character U+0BC8 'ை' in identifier

타밀어 결합 표시 문제의 이해

무슨 일이 일어나고 있는지 이해하려면 타밀어 스크립트의 작동 방식을 조금 아는 것이 중요합니다.

타밀어는 아부기다로, 각 자음-모음 순서가 하나의 단위로 기록되는 표기 체계입니다. 유니코드에서는 기본 자음 문자를 모음이나 기타 수식어를 나타내는 하나 이상의 결합 기호와 결합하는 경우가 많습니다.

예:

  • 타밀어 க(U 0B95)는 자음 "ka"를 나타냅니다.

  • "ki"를 나타내려면 க를 모음 기호 ி (U 0BBF)와 결합하여 கி가 됩니다.

  • 모음 기호 ி는 결합 표시로, 특히 유니코드에서 "간격 없는 표시"로 분류됩니다.

여기서 문제가 발생합니다.

Go의 언어 사양에서는 식별자에 유니코드 문자를 허용하지만 결합 표시는 제외합니다. 특히 식별자에는 "Letter"(Lu, Ll, Lt, Lm, Lo 또는 Nl 범주) 및 숫자로 분류된 문자가 포함될 수 있지만 결합 기호(Mn, Mc, Me 범주)는 포함될 수 없습니다.


타밀어 결합 표시의 예

타밀어 문자가 어떻게 형성되는지 살펴보겠습니다.

  • 독립 자음: க (U 0B95) - Go 식별자에서 허용됩니다.

  • 자음 모음 기호: கா (U 0B95 U 0BBE) - ா (U 0BBE)는 결합 기호(Mc)이므로 허용되지 않습니다.

  • 자음 모음 기호: கி (U 0B95 U 0BBF) - ி (U 0BBF)는 결합 기호(Mn)이므로 허용되지 않습니다.

  • 자음 모음 기호: கூ (U 0B95 U 0BC2) - ூ (U 0BC2)는 결합 기호(Mc)이므로 허용되지 않습니다.

식별자 எண்ணிக்கை("숫자")에서 문자에는 결합 표시가 포함됩니다.

  • எ (U 0B8E) - 편지, 허용됩니다.

  • ண் (U 0BA3 U 0BCD) - ண(U 0BA3)과 결합 기호(Mn)인 비라마 ்(U 0BCD)로 구성됩니다.

  • ண (U 0BA3) - 편지, 허용됩니다.

  • ிக்கை - ி(U 0BBF) 및 ை(U 0BC8)과 같은 결합 기호가 포함되어 있습니다.

이러한 결합 표시는 Go 식별자에서 허용되지 않기 때문에 컴파일러는 이를 발견할 때 오류를 발생시킵니다.


한자는 작동하지만 타밀어는 작동하지 않는 이유

한자는 일반적으로 유니코드에서 "Letter, Other"(Lo) 범주로 분류됩니다. 이는 완전한 문자를 형성하기 위해 결합 표시가 필요하지 않은 독립형 기호입니다. 이것이 消息와 같은 식별자가 Go에서 완벽하게 작동하는 이유입니다.

실용적 시사점

식별자에 결합 기호를 사용할 수 없다는 점은 타밀어와 같은 스크립트에 중요한 영향을 미칩니다.

  • 표현의 제한: 기호를 결합하지 않으면 타밀어로 의미 있는 식별자를 작성하는 것이 거의 불가능합니다.

  • 교육 장벽: 기본 스크립트를 사용하면 코드 학습에 더 쉽게 접근할 수 있지만 이러한 제한은 특히 아부가다 기반 쓰기 시스템을 따르는 언어의 경우 이러한 가능성을 방해합니다.

  • 포괄성 문제: Go는 UTF-8 지원을 통해 포괄성을 목표로 하지만 표시 결합에 대한 제한으로 인해 이에 의존하는 많은 언어가 제외됩니다.

마무리

Go의 UTF-8 지원은 프로그래밍을 더욱 포괄적으로 만드는 큰 진전입니다. 그러나 식별자에서 결합 기호를 제외하면 결합 기호가 스크립트에 필수적인 타밀어, 힌디어, 아랍어와 같은 언어에 대한 장벽이 됩니다.

주로 Go에서 작업하는 타밀나두 출신의 개발자로서 이 발견은 흥미롭기도 하고 약간 실망스럽기도 했습니다. 프로그래밍 언어의 진정한 국제화의 복잡성을 강조합니다.

소프트웨어 제품 구축을 위해 모국어로 코딩하는 사람은 누구입니까!?!!!!

물론이죠! '아부기다' 기반의 표기법을 따르지 않는 동아시아 지역과 크게 다르지 않습니다.

그리고 분명히 Go 제작자는 애초에 '모국어 코딩'에 대해 UTF-8 준수를 의도하지 않았을 것입니다. 그 이유는 더 나은 ASCII 처리, 최신 웹 표준에 대한 정렬, 일관된 문자열 처리 및 상호 운용성을 향한 한 단계를 제공하는 것이었습니다.

이 시도는 Go에서 UTF-8 규정 준수를 어디까지 적용할 수 있는지 이해하려는 호기심이었습니다. Go에서 확장 가능하고 분산된 핀테크 시스템을 구축하는 작업을 하는 사람으로서 저는 이러한 미묘한 차이를 인식하는 것이 중요하다고 생각했습니다.


그렇습니다. 읽어주셔서 감사합니다.

행복한 코딩하세요 :) 코드가 함께하길 바랍니다.

위 내용은 Go의 UTF 지원: 흥미로운 제한의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.