logo

줄리아에서 유니코드 문자열의 일부만 슬라이싱하는 법 📂줄리아

줄리아에서 유니코드 문자열의 일부만 슬라이싱하는 법

개요

여느 프로그래밍 언어들이 그러하듯, 줄리아에서는 영문을 아스키 코드aSCII Code로 쓰고 한자, 한글 등을 유니코드unicode로 쓴다. 문제는 다른 언어들과 달리 이 문자열들을 다루기가 상당히 까다롭다는건데, 이는 성능상의 이유로 의도된 것이라서1 불편해도 참고 쓰는 수밖에 없다.

코드

julia> str1 = "English"
"English"

julia> str2 = "日本語"
"日本語"

julia> str3 = "한국어"
"한국어"

예를 들어 위와 같은 문자열들이 주어져 있다고 하자.

julia> str1[2:end]
"nglish"

str1의 경우 아무 특별할 것 없는 영어 문자열이고, 아스키코드기 때문에 위와 같이 일반 배열에 접근하듯 슬라이싱이 가능하다.

julia> str2[2:end]
ERROR: StringIndexError: invalid index [2], valid nearby indices [1]=>'日', [4]=>'本'
Stacktrace:
 [1] string_index_err(s::String, i::Int64)
   @ Base .\strings\string.jl:12
 [2] getindex(s::String, r::UnitRange{Int64})
   @ Base .\strings\string.jl:266
 [3] top-level scope
   @ c:\Users\rmsms\OneDrive\lab\population_dynamics\REPL.jl:6

그러나 str2는 한자기 때문에 유니코드로 쓰여있고, 위와 같은 인덱스 에러를 레이즈한다. 에러 메세지를 보건대 두번째 글자의 인덱스는 2가 아니라 4인 것을 짐작할 수 있고, 실제로 4부터 인덱싱을 해보면 다음과 같이 원래의 의도대로 슬라이싱이 된다.

julia> str2[4:end]
"本語"

이는 다음과 같이 한국어에도 마찬가지로 적용된다. 같은 유니코드기 때문에 다를 이유가 없다.

julia> str3[4:end]
"국어"

julia> str3[6]
ERROR: StringIndexError: invalid index [6], valid nearby indices [4]=>'국', [7]=>'어'
Stacktrace:
 [1] string_index_err(s::String, i::Int64)
   @ Base .\strings\string.jl:12
 [2] getindex_continued(s::String, i::Int64, u::UInt32)
   @ Base .\strings\string.jl:237
 [3] getindex(s::String, i::Int64)
   @ Base .\strings\string.jl:230
 [4] top-level scope
   @ c:\Users\rmsms\OneDrive\lab\population_dynamics\REPL.jl:9

julia> str3[7]
'어': Unicode U+C5B4 (category Lo: Letter, other)

트릭

julia> String(collect(str3)[2:3])
"국어"

그나마 편하게 쓰는 방법으로는 위와 같이 collect()로 문자의 배열로 풀어헤쳐서 슬라이싱을 하고 다시 문자열로 뭉치는 수가 있다.

환경

  • OS: Windows
  • julia: v1.8.3