카테고리 보관물: 러스트

러스트(Rust)에서 한글 문자열 글자수 세기

러스트(Rust)에서 한글 문자열을 세기 위해서 단순하게 아래와 같이 len()을 사용하면 제대로 세지를 못한다. chars().count()을 이용해서 정확하게 셀 수 있다. 아래 코드를 실행하면, 정확하게 알 수 있다.

fn main() {
let temp = "안녕하세요!";
println!("temp.chars().count()로 센 글자수:{}", temp.chars().count());
println!("temp.len() 센 글자수:{}", temp.len());
}

러스트에서 `String`을 이용할 때, 생기는 유니코드 문제점

러스트에서 문자열을 다루는 방법은 String을 이용하는 것입니다. 그런데 이것을 이용하더라도 유니코드를 사용하는 경우 인텍싱이 다른 언어와 같이 명확하게 처리되지 않습니다. 다음 코드를 살펴봅시다.

fn main() {
let s1 = String::from("hello world!");
let hello = &s1[0..5];
let world = &s1[6..11];
println!("{}, {}", hello, world);

let s1 = String::from("안녕 세계!");
let hello = &s1[0..6];
let world = &s1[7..13];
println!("{}, {}", hello, world);

let s1 = String::from("こんにちは世界!");
let hello = &s1[0..15];
let world = &s1[15..21];

println!("{}, {}", hello, world);
}

윗 코드를 실행하면 다음과 같은 결과 나옵니다. 앞에서 인텍싱하는 코드를 살펴보면 글자 수와 인덱싱 숫자가 맞지 않는 것을 알 수 있습니다.

❯ cargo run
Compiling ownership v0.1.0 (/Users/jaehwan/git/rust/projects/ownership)
Finished dev [unoptimized + debuginfo] target(s) in 0.39s
Running `target/debug/ownership`
hello, world
안녕, 세계
こんにちは, 世界

참고하세요!