λ¬μ€νΈλ‘ GraphQL μλ² κ°λ° μ€ λ¬Έμμ΄ νμ±μ λ°©λ²μ μ°Ύμ보λ chars ν¨μλ₯Ό μ΄μ©ν΄ νμ±ν μ μμμ΅λλ€. λ€μμ μμ μ½λμ
λλ€.
fn main() {
let text: String = String::from("Hello, μλ
νμΈμ");
for (i, c) in text.chars().enumerate() {
println!("μμΉ {}: {}", i, c);
}
}
ν°λ―Έλμ λ¬Έμμ΄μ΄ νλμ© μΆλ ₯λ¨μ νμΈ ν μ μμ΅λλ€. κ·Έλ¬λ€ λ¬Έλ chars ν¨μμ λμ μλ¦¬κ° κΆκΈν΄μ‘μ΅λλ€. κ·Έλμ ν¨μμ μ€λͺ
μ μ°Ύμ보λ λ€μκ³Ό κ°μ΄ μ€λͺ
λμ΄ μμ΅λλ€.
// Returns an iterator over the chars of a string slice.
// As a string slice consists of valid UTF-8, we can iterate through a string slice by char. This method returns such an iterator.
// It's important to remember that char represents a Unicode Scalar Value
// and might not match your idea of what a 'character' is. Iteration over grapheme clusters may be what you actually want.
// This functionality is not provided by Rust's standard library, check crates. io instead.
fn chars() {...}
λ§μ§λ§ λ¬Έμ₯μ μ£Όλͺ©ν΄μΌ ν©λλ€. λ°νλλ λ¬Έμλ μ λμ½λ μ€μΉΌλΌ κ°μ΄λ©°, μΌλ°μ μΈ λ¬Έμκ° μλ μ μλ€κ³ ν©λλ€. μ΄λ¬ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
fn main() {
let text: String = String::from("αααΊαΉααα¬");
for (i, c) in text.chars().enumerate() {
println!("μμΉ {}: {}", i, c);
}
}
/**
* μμΉ 0: α
* μμΉ 1: α
* μμΉ 2: αΊ
* μμΉ 3: αΉ
* μμΉ 4: α
* μμΉ 5: α
* μμΉ 6: α¬
*/
μκ°μ μΌλ‘ 보μ΄λ λ¬Έμμ κΈΈμ΄λ 5κ°, νμ± κ²°κ³Όλ 7κ°λ‘ κ°μκ° μμ΄ν©λλ€. μ¬κΈ°μ κΆκΈμ¦μ΄ μκ²Όμ΅λλ€. μ μκ°μ μΌλ‘ 보μ΄λ λ¬Έμλ‘ νμ±νμ§ λͺ»ν κΉμ?
κ·Έ μ΄μ λ₯Ό μμ보기 μν΄ chars ν¨μκ° λ°ννλ μ λμ½λμ λν΄ μμλ΄
μλ€.
μ μΈκ³μ λͺ¨λ λ¬Έμλ₯Ό μΌκ΄λκ² νν ν μ μλλ‘ μ€κ³λ κ΅μ νμ€ λ¬Έμ μΈμ½λ© 체κ³μ λλ€.
μ λμ½λλ 17κ° νλ©΄(Plane, 0~16λ²)μΌλ‘ λλλ©° μ΄λ μ 체 μ½λ 곡κ°μ 17κ°μ λμΌν ν¬κΈ°λ‘ λλ ꡬμμ μλ―Έν©λλ€. νμ¬λ μ 체 ν¬κΈ° μ€μ μ½ 15% μ λλ§ μ¬μ©νκ³ μμ΄
μΆν λ λμ΄λλ λ¬Έμμ λν΄μ λ³΄μΆ©μ΄ κ°λ₯ν©λλ€. μ¬κΈ°μ κ° νλ©΄μ νν κ°λ₯ν κ°μ μ λμ½λ μ½λ ν¬μΈνΈμ΄λΌ ν©λλ€. κ° νλ©΄ λ³λ‘μ μν μ λ€μκ³Ό κ°μ΅λλ€.
| νλ©΄ | λͺ μΉ | λ²μ | μ©λ |
|---|---|---|---|
| 0 | κΈ°λ³Έ λ€κ΅μ΄ νλ©΄<br/>(Basic Multilingual Plane, BMP) | U+0000 ~ U+FFFF | ASCII, νκΈ, νμ,<br/>λΌν΄λ¬Έμ λ±<br/>κ°μ₯ μΌλ°μ μΈ λ¬Έμλ€ |
| 1 | 보좩 λ€κ΅μ΄ νλ©΄<br/>(Supplementary Multilingual Plane, SMP) | U+10000 ~ U+1FFFF | κ³ λ λ¬Έμ, μμ κΈ°νΈ,<br/>μν κΈ°νΈ λ± |
| 2 | μν λ¬Έμ 보좩 νλ©΄<br/>(Supplementary Ideographic Plane, SIP) | U+20000 ~ U+2FFFF | ν¬κ· νμ, μΆκ° νμ |
| 3 | μ 3 νλ©΄<br/>(Tertiary Ideographic Plane, TIP) | U+30000 ~ U+3FFFF | κ³ λ νμ |
| 4-13 | λ―Έν λΉ νλ©΄<br/>(Unassigned Planes) | U+40000 ~ U+DFFFF | λ―Έλλ₯Ό μν΄ μμ½ |
| 14 | 보좩 νΉμ μ©λ νλ©΄<br/>(Supplementary Special-purpose Plane, SSP) | U+E0000 ~ U+EFFFF | νΉμ κΈ°νΈ, μ μ΄ λ¬Έμ |
| 15 | μ¬μ©μ μ μ μμ A<br/>(Supplementary Private Use Area-A) | U+F0000 ~ U+FFFFF | κ°μΈμ΄λ μ‘°μ§μ΄<br/>μμ λ‘κ² μ¬μ© |
| 16 | μ¬μ©μ μ μ μμ B<br/>(Supplementary Private Use Area-B) | U+100000 ~ U+10FFFF | κ°μΈμ΄λ μ‘°μ§μ΄<br/>μμ λ‘κ² μ¬μ© |
μ λμ½λλ UTF-8κ³Ό UTF-16μ μΈμ½λ© λ°©μμ κ°μ§λλ€. 8, 16μ΄λΌλ μ«μλ λ¬Έμ μΈμ½λ©μ μ΅μ λΉνΈ μλ₯Ό μλ―Έν©λλ€. λ€μμ μΈμ½λ© λ°©μμ λ°λ₯Έ λΉνΈ μμ λλ€.
| μ λμ½λ λ²μ | νλ©΄ | UTF-8 | UTF-16 |
|---|---|---|---|
| U+0000~U+007F | νλ©΄ 0 (ASCII) | 1λ°μ΄νΈ | 2λ°μ΄νΈ |
| U+0080~U+07FF | νλ©΄ 0 (λΌν΄νμ₯ λ±) | 2λ°μ΄νΈ | 2λ°μ΄νΈ |
| U+0800~U+FFFF | νλ©΄ 0 (BMP λλ¨Έμ§) | 3λ°μ΄νΈ | 2λ°μ΄νΈ |
| U+10000~U+10FFFF | νλ©΄ 1~15 (보좩 νλ©΄) | 4λ°μ΄νΈ | 4λ°μ΄νΈ |
λ¬μ€νΈμ μΌλ°μ μΈ μΉμ UTF-8, μλ°μ€ν¬λ¦½νΈλ UTF-16μ μ¬μ©ν©λλ€.
λΈλΌμ°μ μμ μλ°μ€ν¬λ¦½νΈλ‘ λ¬Έμμ΄μ μ λ¬ ν λμλ μλμΌλ‘ UTF-16μΌλ‘ λ³νν©λλ€.
μ λμ½λλ μΈμ΄μ λ°λΌ ν κΈμμ ν¬κΈ°κ° κ°λ³μ μ΄λ©° νΉμλ¬Έμκ° κ²½μ° λ³λμ μ²λ¦¬λ₯Ό ν΄μΌνκΈ° λλ¬Έμ κ° μΈμ΄μ λ§λ μμ ν κΈμλ‘ νμ±νλ κ²μ 볡μ‘ν κΈ°λ₯μ
λλ€.
μλλ unicode-segmentation λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λ¬Έμμ΄μ νμ±ν μμμ
λλ€. λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλλΌλ λ°μκΈ°νΈκ° λΆλ¦¬λμ μΆλ ₯λ©λλ€.
use unicode_segmentation::UnicodeSegmentation;
fn main() {
let text = "αααΊαΉααα¬";
for grapheme in text.graphemes(true) {
println!("{}", grapheme);
}
}
/**
* α
* ααΊαΉ
* α
* α
* α¬
*/
κ·Έλ λ€λ©΄ λ€λ₯Έ μΈμ΄λ₯Ό νμ±ν΄λ΄
μλ€. μλλ νλμ€μ΄μ cafΓ©μ νμ±ν κ²°κ³Όμ
λλ€. νλμ€μ΄μμ μ
μΌνΈκ° λ¬Έμμ κ²°ν©λμ΄ μΆλ ₯λκ³ μμ΅λλ€.
use unicode_segmentation::UnicodeSegmentation;
fn main() {
let text = "cafΓ©";
for grapheme in text.graphemes(true) {
println!("{}", grapheme);
}
}
/**
* c
* a
* f
* Γ©
*/
μ λ―Έμλ§μ΄μ νλμ€μ΄μ νμ± κ²°κ³Όκ° λ€λ₯Έμ§ μ΄ν΄λ΄ μλ€.
unicode-segmentation λΌμ΄λΈλ¬λ¦¬λ μ λμ½λμ UAX #29 (Unicode Text Segmentation) κ·μΉμ λ°λΌ λ¬Έμμ΄μ νμ±ν©λλ€. μ΄ κ·μΉμ λ¬Έμμ ν΄λ¬μ€ν°, λ¨μ΄, λ¬Έμ₯ λ¨μλ‘ λΆν λ¨μλ₯Ό μ νκ³ μμ΅λλ€.
λ¬Έμμ ν΄λ¬μ€ν°λ μ μ κ° μΈμνλ λ¬Έμμ μ΅μ λ¨μλ‘, νλμ λ¬Έμλ₯Ό μλ―Έν©λλ€. νκΈμ κ²½μ° "κ°", λΌν΄ λ¬Έμμ κ²½μ° "Γ©" λ±μ μλ―Έν©λλ€.
λ¨μ΄λ λ¬Έμμ ν΄λ¬μ€ν°μ μ§ν©μΌλ‘, 곡백μ΄λ ꡬλμ μΌλ‘ ꡬλΆλ©λλ€. λ¨μ΄μ κ²½κ³λ 곡백μ΄λ ꡬλμ μΌλ‘ ꡬλΆλ©λλ€.
λ¬Έμ₯μ λ¨μ΄μ μ§ν©μΌλ‘, λ§μΉ¨ν, λλν, λ¬Όμνλ‘ κ΅¬λΆλ©λλ€. λ¬Έμ₯μ κ²½κ³λ λ§μΉ¨ν, λλν, λ¬Όμνλ‘ κ΅¬λΆλ©λλ€.
λ¬Έμμ ν΄λ¬μ€ν°λ μ¬λ¬κ°μ§ λ¬Έμ μμ±μ κ°μ§ λ¬Έμλ‘ κ΅¬μ±λμ΄ μμ΅λλ€. μ£Όμ μμ±λ€μ μλμ κ°μ΅λλ€.
μ΄ κΈ°μ€μΌλ‘ μΈμ΄λ³λ‘ μμλ₯Ό μ΄ν΄λ΄ μλ€.
μμλ₯Ό 보면 νλμ€μ΄μ μ
μΌνΈμΈ κ²½μ° Extendλ‘ λΆλ₯λμ΄ μκ³ , λ―Έμλ§μ΄μ λ°μκΈ°νΈλ SpacingMarkλ‘ λΆλ₯λμ΄ μμ΅λλ€. SpacingMarkλ μμ μ 곡κ°μ κ°μ§λ νμμ΄λ―λ‘, λ€λ₯Έ λ¬Έμμ λΆλ¦¬λμ΄ μΆλ ₯λ©λλ€.
κ²°κ΅ λ¬Έμμ μμ±μ λ°λΌ νμ± κ²°κ³Όκ° λ¬λΌμ§κ² λ©λλ€. λ§μ½ λ―Έμλ§μ΄μ λ°μκΈ°νΈλ₯Ό λΆλ¦¬νμ§ μκ³ μΆλ ₯νκ³ μΆλ€λ©΄ κ° μ λμ½λ μ½λ ν¬μΈνΈλ₯Ό λΆμνμ¬ SpacingMarkλ₯Ό κ²°ν©νλ λ‘μ§μ μΆκ°ν΄μΌ ν©λλ€.