์ฌ๊ธฐ ํ ๋ก ์์ ์๊ฐ์ ์ป์์ต๋๋ค.
https://github.com/dotnet/corefxlab/issues/1751
.NET์ด ์ ๋์ฝ๋ ์ง์๊ณผ ํจ๊ป ์ง๋ฉดํ ๋ฌธ์ ์ค ํ๋๋ ํ์ฌ ์ฌ์ฉ๋์ง ์๋ ๋์์ธ์ ๋ฟ๋ฆฌ๋ฅผ ๋๊ณ ์๋ค๋ ๊ฒ์
๋๋ค. .NET์์ ๋ฌธ์๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ 16๋นํธ ๊ฐ์ธ System.Char
๋ก ์ ๋์ฝ๋ ๊ฐ์ ๋ํ๋ด๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
.NET ๊ฐ๋ฐ์๋ ์ ๋นํ ๋๋ฆฌ ์์ ๋ํด ๋ฐฐ์์ผ ํฉ๋๋ค.
https://msdn.microsoft.com/en-us/library/xcwwfbb8 (v=vs.110).aspx
๊ฐ๋ฐ์๋ ์ด ์ง์์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ ์ ๋์ฝ๋์ ์ต์ํ์ง ์๊ณ .NET์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ณ ์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
32๋นํธ ์ ์๋ก ์ง์๋๊ณ codePoint์ ํด๋นํ๋ฉฐ C#์์ ํด๋น rune
์ ํ์ ์ด ์ ํ์ ๋ณ์นญ์ผ๋ก ํ์ํ๋ System.Rune
๋ฅผ ๋์
ํ ๊ฒ์ ์ ์ํฉ๋๋ค.
rune
๋ char
์ ๊ธฐ๋ณธ ๋์ฒดํ์ด ๋๋ฉฐ .NET์์ ์ ์ ํ ์ ๋์ฝ๋ ๋ฐ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ธฐ์ด ์ญํ ์ ํฉ๋๋ค.
์ด๋ฆ์ด rune์ธ ์ด์ ๋ Go์์ ์๊ฐ์ ์ป์์ต๋๋ค.
https://blog.golang.org/strings
"์ฝ๋ ํฌ์ธํธ, ์บ๋ฆญํฐ ๋ฐ ๋ฃฌ" ์น์ ์ ์ค๋ช ์ด ์ ๊ณต๋๋ฉฐ ์งง์ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"์ฝ๋ ํฌ์ธํธ"๋ ์ฝ๊ฐ์ ์ ์ผ๋ก, ๊ทธ๋์ Go๋ ๊ฐ๋ ์ ๋ํ ๋ ์งง์ ์ฉ์ด์ธ ๋ฃฌ์ ์๊ฐํฉ๋๋ค. ์ด ์ฉ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋์ ๋ํ๋๋ฉฐ "์ฝ๋ ํฌ์ธํธ"์ ์ ํํ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ถ๊ฐ ์ฌํญ์ด ์์ต๋๋ค.
์
๋ฐ์ดํธ ์ด์ ์ฌ๊ธฐ์ System.Rune
๊ตฌํ์ด ์์ต๋๋ค.
https://github.com/migueldeicaza/NStack/blob/master/NStack/unicode/Rune.cs
๋ค์ API ์ฌ์ฉ:
public struct Rune {
public Rune (uint rune);
public Rune (char ch);
public static ValueTuple<Rune,int> DecodeLastRune (byte [] buffer, int end);
public static ValueTuple<Rune,int> DecodeLastRune (NStack.ustring str, int end);
public static ValueTuple<Rune,int> DecodeRune (byte [] buffer, int start, int n);
public static ValueTuple<Rune,int> DecodeRune (NStack.ustring str, int start, int n);
public static int EncodeRune (Rune rune, byte [] dest, int offset);
public static bool FullRune (byte [] p);
public static bool FullRune (NStack.ustring str);
public static int InvalidIndex (byte [] buffer);
public static int InvalidIndex (NStack.ustring str);
public static bool IsControl (Rune rune);
public static bool IsDigit (Rune rune);
public static bool IsGraphic (Rune rune);
public static bool IsLetter (Rune rune);
public static bool IsLower (Rune rune);
public static bool IsMark (Rune rune);
public static bool IsNumber (Rune rune);
public static bool IsPrint (Rune rune);
public static bool IsPunctuation (Rune rune);
public static bool IsSpace (Rune rune);
public static bool IsSymbol (Rune rune);
public static bool IsTitle (Rune rune);
public static bool IsUpper (Rune rune);
public static int RuneCount (byte [] buffer, int offset, int count);
public static int RuneCount (NStack.ustring str);
public static int RuneLen (Rune rune);
public static Rune SimpleFold (Rune rune);
public static Rune To (Case toCase, Rune rune);
public static Rune ToLower (Rune rune);
public static Rune ToTitle (Rune rune);
public static Rune ToUpper (Rune rune);
public static bool Valid (byte [] buffer);
public static bool Valid (NStack.ustring str);
public static bool ValidRune (Rune rune);
public override bool Equals (object obj);
[System.Runtime.ConstrainedExecution.ReliabilityContractAttribute((System.Runtime.ConstrainedExecution.Consistency)3, (System.Runtime.ConstrainedExecution.Cer)2)]
protected virtual void Finalize ();
public override int GetHashCode ();
public Type GetType ();
protected object MemberwiseClone ();
public override string ToString ();
public static implicit operator uint (Rune rune);
public static implicit operator Rune (char ch);
public static implicit operator Rune (uint value);
public bool IsValid {
get;
}
public static Rune Error;
public static Rune MaxRune;
public const byte RuneSelf = 128;
public static Rune ReplacementChar;
public const int Utf8Max = 4;
public enum Case {
Upper,
Lower,
Title
}
}
์๋ ค์ง ๋ฌธ์ ์ ๋ฐ์ดํธ
๋ฉ๋ชจ๋ฆฌ ๋ด ํํ์ด 32๋นํธ ๊ฐ์ฒด์ ๋ฌธ์์ด์ด๊ฑฐ๋ ์ฆ์์์ ๋ฒ์ญ๋ ๊ฒ์ผ๋ก ์์ํ์ญ๋๊น? ์ ์๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๋ฐฐ๋ก ๋์ด๋๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ํ์์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์นฉ๋๊น?
ํน์ ์ ๋์ฝ๋ ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐ๋ผ ์ ๋์ฝ๋ ๊ด๋ จ ๊ธฐ์ ์ ๋ช ๋ช ํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ ๋๊น?
๋ด ์๊ฐ์ ์ ์(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ ๋ช
์์ ์ด์ด์ผ ํ ํ์๊ฐ ์์)์ ๋ฌธ์์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ด ํํ์ด ์ ํ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. Rune
์ ํ์ ๊ณ ์ ํ ๊ฐ๋ณ 21๋นํธ ์ฝ๋ ํฌ์ธํธ(32๋นํธ int๋ก ์ ์ฅ๋จ)๋ฅผ ๋ํ๋
๋๋ค. ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ฐธ์กฐํ๋ ๋ฉ์๋ ๋ ์ ์ฌ์ ์ผ๋ก Rune
๋ฅผ ๋์ ๋ฐํํ ์ ์์ต๋๋ค. string
์๋ Rune
๋ฅผ ์ด๊ฑฐํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ ๊ฒ์
๋๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ํด ํฉ์๋ฅผ ์ป์ด์ผ ํ ๋ช ๊ฐ์ง ๋ถ๋ช ํ ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Int32
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค Rune
์ ํ์ ๋ง๋๋ ๋ฐ ์ค์ํ ๊ฐ์น๊ฐ ์์ต๋๊น?(1)์ ๋ตํ๋ ค๋ฉด $#$ Int32
Rune
์ด ์ด๋ป๊ฒ ๋
ธ์ถ๋๋์ง, ์ด๋ค ๋ฉ์๋๊ฐ ์ด๋ฅผ ์์ ํ๊ณ ๋ฐํํ๋์ง ๋ฑ์ ๋ํ ์์ธํ ์ค๋ช
์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ Int32
.
(2)์ ๊ดํด์๋ ๋ ์์ ์ด ์กฐ๊ธ ๋ง์ค์ฌ์ง๋ค. "๋ฃฌ"์ ์์ด๋ก ๋ ์ผ์ข ์ ๋ํดํ ๋จ์ด์ด๋ฉฐ ์ด ๋ฌธ๋งฅ์์ ์ฌ์ฉํ๋ ๋ฐ ์์ด ๋ช ๊ฐ์ง ํน์ดํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ ๊ธฐํ๋ ์์ ๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ ๋์ฝ๋ ๊ฐ๋ ๊ณผ ์ถฉ๋ํฉ๋๋ค. "Unicode Rune"์ ๊ฒ์ํ ๋ ์ฃผ๋ก Runic Unicode ๋ธ๋ก์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ณ Go ์ธ์ด ๋ฌธ์์ ์ผ๋ถ๋ง ์ป์ต๋๋ค.
char
๋ ์ ๋ฐ ๋จ์ด์ด์ ์ ์ฒด ๋จ์ด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ์ ๊ฐ์ด ๋ฐ ๊ธ์ ๋๋ ์ ์ฒด ๊ธ์๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ฃผ๋ณ์ ์กฐ์ฌํด์ผ ํฉ๋๋ค.
์๋ง๋ System.character
์ฌ๊ธฐ์์ ํญ์ ์ ์ฒด ๋ฌธ์๊ฐ... :์ ๊ธ๋ผ์ค:
char
๋ ์ฝ๊ฐ ๋์ฐํ ํํ์ด๋ฉฐ ASCII/๋ผํด์ด ์ ์ฉ ์ธ์ด์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด๋ชจํฐ์ฝ์ ๋ถ์์ ์ฌ์ ํ โโโโ์นจํฌํ ๊ฒ์
๋๋ค. char
๊ฐ ์ํ์ด๊ณ ๋ค์ char
์ ํ์ ํ์ธํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
ํธ์ํฐ์ @NickCraver
utf8์ ๊ฐ๋ณ ๋๋น ์ธ์ฝ๋ฉ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๋ฐ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ต๋๋ค. utf8๊ณผ utf32 ๋ชจ๋.
32๋นํธ ์ ํ์ ์ด๊ฑฐ์ ์ ํฉํฉ๋๋ค.
์ฑ๋ฅ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๊ด์ ์์ indexOf, Length ๋ฑ์ด ๋ ์ด๋ ต์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ฌธ์์ ๋ํด ๊ด์ฌ์ ๊ฐ๊ธฐ ์์ํ๋ฉด ๋๋ฌธ์, ๋ฌธ์ ๋ถํ , ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๋ฉด ๋ฐ์ดํธ๊ฐ ๊ฐ๋ณ ๋๋น๊ฐ ๋ฉ๋๋ค. Char๋ ๊ทธ๊ฒ์ ๋ ์ข๊ฒ ๋ง๋ค์ง ์์ต๋๋ค. ๊ฐ์ฅ ์์ ๋ฌธ์์ ํฌ๊ธฐ๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฝ๋๋ค. ๋ ๋ง์ ๋ฌธ์๋ฅผ ํฌํจํ์ง๋ง ์ฌ์ ํ ๊ฐ๋ณ ๋๋น์ ๋๋ค.
์ด๋ฅผ ์ํด 32๋นํธ ๊ฐ์ ์ฌ์ฉ์ ์ฝ๋ ๊ด์ ์์ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์น, ๊ธธ์ด ๋ฐ ๋ณด์กฐ ํญ๋ชฉ(indexOf ๋ฑ)์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ ๋ ASCII ์ ์ฉ ๋ฌธ์์ด๊ณผ utf8 ๋ฌธ์์ด "Compact String implementation" https://github.com/dotnet/coreclr/issues/7083; ASCII ์ ์ฉ ๋ฌธ์์ด์ ๋น ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํด
๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ์ฃผ์ฅํ๋ ๋ชจ๋ ๊ฒ์ ๋ฐ๋ํ๋ ๊ฒ์... utf8์ 32๋นํธ ํํ์ด ์ด๋ค ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์์น๋ ์์น์ ๋งคํ๋ฉ๋๋ค. ๋ฌธ์๋ฅผ ์ฐพ๋ ๊ฒ์ ASCII์์์ ๊ฐ์ด ๋น ๋ฅด๋ฉฐ ํญ๋ชฉ์ ๊ธฐ๋ณธ ํฌ๊ธฐ ๋ฑ์ ๋๋ค. ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐ์ดํธ ๋๋ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ๋์ ๋ฉ๋๊น?
๋ก์ ๋ณํ์ ๋ ๋น์๋๋ค. ๊ทธ๋์ ๋ ๋ง์ ์ฒ๋ฆฌ ํ์์ด ๋ ๊ฒ์ ๋๋ค. ์ ์ฅ ํ์๋ณด๋ค
@migueldeicaza ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ํํ์ด ๊ฐ์ ํฌํจ๋๋๋ก ๋จ์ผ ๋ฌธ์ ํ์์ 16๋นํธ ๋ฌธ์์์ 32๋นํธ๋ก ํ์ฅํ๋ ๊ฒ์ ๋ํด์๋ง ์ธ๊ธํ๊ณ ์์ต๋๋ค. ๋ฐ๊ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๋๋ผ ๋ฐ๋์ ๋ด๋ถ ํ์์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ(์: ์์น์ ๊ด๊ณ, ๊ฒ์ ๋น์ฉ ๋ฑ)
์ ์ณ๋๊ณ : Swift๋ ์ ์ฒด ๋ฌธ์ ํ์ ๋ ์ฒ๋ฆฌํฉ๋๋ค.
Swift๋ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ํํ์ ์ ๊ทผํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. for-in ๋ฌธ์ผ๋ก ๋ฌธ์์ด์ ๋ฐ๋ณตํ์ฌ ์ ๋์ฝ๋ ํ์ฅ ์์ ํด๋ฌ์คํฐ๋ก ๊ฐ๋ณ ๋ฌธ์ ๊ฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด ํ๋ก์ธ์ค๋ ์บ๋ฆญํฐ ์์ ์ ์ค๋ช ๋์ด ์์ต๋๋ค.
๋๋ ๋ค๋ฅธ ์ธ ๊ฐ์ง ์ ๋์ฝ๋ ํธํ ํํ ์ค ํ๋๋ก String ๊ฐ์ ์ก์ธ์คํฉ๋๋ค.
- UTF-8 ์ฝ๋ ๋จ์ ๋ชจ์(๋ฌธ์์ด์ utf8 ์์ฑ์ผ๋ก ์ก์ธ์ค)
- UTF-16 ์ฝ๋ ๋จ์ ๋ชจ์(๋ฌธ์์ด์ utf16 ์์ฑ์ผ๋ก ์ก์ธ์ค)
- ๋ฌธ์์ด์ UTF-32 ์ธ์ฝ๋ฉ ํ์์ ํด๋นํ๋ 21๋นํธ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ ๋ชจ์(๋ฌธ์์ด์ unicodeScalars ์์ฑ์ผ๋ก ์ก์ธ์ค)
๋๋ ์๋ ๋ฌธ์ ์์ ๊ทธ๊ฒ์ ๋งํ๊ณ ๋ค์ ๋งํ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ๊ตฌ๊ฐ ๋ง์์ ๋ค์ง ์๊ธฐ ๋๋ฌธ์ ํ์ค์ด ๋งํ๋ ๊ฒ์ ํฌ๊ธฐํ๋ ๊ฒ์ ํด๊ฒฐ๋๋ ๊ฒ๋ณด๋ค ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ฉฐ, ์ ๋์ฝ๋์ ๋ฃฌ ์ฝ๋ ํ์ด์ง๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ ํผ๋์ค๋ฌ์ธ ๋ฟ์ ๋๋ค.
์ด๋ฆ์ด ์๋ชป๋์์ต๋๋ค.
@๋ฉ๋ฆฌ๋ ธ์
Rune์ ToLower[Invariant], ToUpper[Invariant], ToTitle, IsDigit, IsAlpha, IsGraphic, IsSymbol, IsControl๊ณผ ๊ฐ์ด ์ค๋๋ Char์์ ๊ธฐ๋ํ ์ ์๋ ๋ง์ ์์ ์ ์ ๊ณตํฉ๋๋ค.
๋ํ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
EncodeRune
(๋ฃฌ์ ๋ฐ์ดํธ ๋ฒํผ๋ก ์ธ์ฝ๋ฉ)RuneUtf8Len
(๋ฃฌ์ UTF8๋ก ์ธ์ฝ๋ฉํ๋ ๋ฐ ํ์ํ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํ),IsValid
(์ผ๋ถ Int32 ๊ฐ์ด ์ ํจํ์ง ์์)๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด์ ๋ํ interop๊ณผ ํ์์ ๋ฐ๋ผ Utf8string.
Go ๋ฌธ์์ด ์ง์์ .NET์ผ๋ก ์ด์/์กฐ์ ํ์ผ๋ฉฐ ์ด ์ธ์์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ๋ณด๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค(๋ฐํ์ ๋์๋ง ์์ด).
https://github.com/migueldeicaza/NStack/tree/master/NStack/unicode
@benaadams ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค.
utf8์ 32๋นํธ ํํ์ด ์ด๋ค ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์์น๋ ์์น์ ๋งคํ๋ฉ๋๋ค. ๋ฌธ์๋ฅผ ์ฐพ๋ ๊ฒ์ ASCII์์์ ๊ฐ์ด ๋น ๋ฅด๋ฉฐ ํญ๋ชฉ์ ๊ธฐ๋ณธ ํฌ๊ธฐ ๋ฑ์ ๋๋ค. ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐ์ดํธ ๋๋ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ๋์ ๋ฉ๋๊น?
UTF8์ ๋ฉ๋ชจ๋ฆฌ ๋ด ํํ์ผ๋ก ๊ณ์ ์กด์ฌํ๊ณ ๊ณ์ ํํ์ด ๋ ๊ฒ์ ๋๋ค.
๊ธฐ์กด UTF16 ๋ฌธ์์ด(System.String) ๋๋ ๋ค๊ฐ์ค๋ UTF8 ๋ฌธ์์ด(Utf8String)์ Chars(๋น์ ๊ณผ ๋ด๊ฐ ๋ชจ๋ ๋์ํ๋ ์ด์ )๊ฐ ์๋๋ผ Runes๋ก ๋์ฝ๋ฉํ ๊ฒ์ ๋๋ค.
๋ช ๊ฐ์ง ์๋ Utf8 ๋ฌธ์์ด์ ๋ฃฌ ๋ฌธ์๋ก ๋ณํํฉ๋๋ค.
utf8 ๋ฌธ์์ด์ ๋ฃฌ์ด ํฌํจ๋์ด ์์ต๋๊น?
๋ฐฉ๊ธ ์ธ๋ฑ์๋ฅผ ๊ตฌํํ์ง ์์์์ ์์์ฐจ๋ ธ์ต๋๋ค("n๋ฒ์งธ ๋ฃฌ ๊ฐ์ ธ์ค๊ธฐ").
๋ฌธ์์ด์์ N๋ฒ์งธ ๋ฃฌ์ ๋ํ ์ก์ธ์ค ์๋๋ ๋ฃฌ ์์ฒด๊ฐ ์๋๋ผ ์ ์ฅ์์ ํจ์์
๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ฅ์๊ฐ UTF32์ธ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฃฌ์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์๋ฌด๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํ๋ฌธ์ ์
๋๋ค. UTF16 ๋ฐ UTF8์ N๋ฒ์งธ ์์์ ์ก์ธ์คํ๋ ค๋ฉด ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ ์์(๋ฐ์ดํธ ๋๋ 16๋นํธ ์ ์)๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์บํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฒฝ๊ณ๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ์ ํ์ฑ์ ๊ด๊ณ์์ด n๋ฒ์งธ ๋ฌธ์๋ง ๋ฐํํ๋ String[int n] { get; }
์ ํผ๋ํ์ง ๋ง์ญ์์ค.
@benaadams ์ค์ํํธ ์บ๋ฆญํฐ๋ ๋ฃฌ๋ณด๋ค ํ ๋จ๊ณ ๋์ ๋ ๋ฒจ์ ๋๋ค. swift์ ๋ฌธ์๋ ํ๋ ์ด์์ ๋ฃฌ์ผ๋ก ๊ตฌ์ฑ๋ "ํ์ฅ๋ ์์ ํด๋ฌ์คํฐ"์ด๋ฉฐ, ๊ฒฐํฉ๋ ๋ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐ๋ผ์ Swift ์บ๋ฆญํฐ๋ ๊ณ ์ ๋ 32๋นํธ ํฌ๊ธฐ๊ฐ ์๋๋ผ ๊ฐ๋ณ ๊ธธ์ด์ ๋๋ค(๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ํ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ํ์ ์ํฉ๋๋ค). ๋ค์์ ํด๋น ํ์ด์ง์ ์์ด์ง๋ง ์ด๋ชจํฐ์ฝ์ ์์กฐ ์ค์ ๊น์ง ํ์ฅ๋ฉ๋๋ค.
์ฌ๊ธฐ ์๊ฐ ์์ต๋๋ค. ๋ฌธ์ รฉ๋ ๋จ์ผ ์ ๋์ฝ๋ ์ค์นผ๋ผ รฉ(LATIN SMALL LETTER E WITH ACUTE ๋๋ U+00E9)๋ก ๋ํ๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ๋ฌธ์๋ ํ์ค ๋ฌธ์ e(LATIN SMALL LETTER E ๋๋ U+0065) ๋ค์์ COMBINING ACUTE ACCENT ์ค์นผ๋ผ(U+0301)๊ฐ ์ค๋ ํ ์์ ์ค์นผ๋ผ๋ก๋ ๋ํ๋ผ ์ ์์ต๋๋ค. COMBINING ACUTE ACCENT ์ค์นผ๋ผ๋ ๊ทธ ์์ ์ค๋ ์ค์นผ๋ผ์ ๊ทธ๋ํฝ์ผ๋ก ์ ์ฉ๋์ด ์ ๋์ฝ๋ ์ธ์ ํ ์คํธ ๋ ๋๋ง ์์คํ ์์ ๋ ๋๋ง๋ ๋ e๋ฅผ รฉ๋ก ๋ฐ๊ฟ๋๋ค.
์ ์๊ฒ grapheme
๋จ์ด๋ ๋ ์๊ธฐ ์ค๋ช
์ ์ผ ๊ฒ์
๋๋ค.
์ด๋ฆ์ ๋ ์ผํธ, ๊ฐ์กฐํ์ฌ ๋ฌธ์์ด์ ๋ํ Go ๊ฒ์๋ฌผ์ ๋ค์ ์ธ์ฉํฉ๋๋ค.
" Code point "๋ ์ ์ด ๋ก๋ฒ์ด์ง๊ธฐ ๋๋ฌธ์ Go์์๋ ๊ฐ๋ ์ ๋ํด ๋ ์งง์ ์ฉ์ด์ธ ๋ฃฌ์ ์๊ฐํฉ๋๋ค. ์ด ์ฉ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋์ ๋ํ๋๋ฉฐ "์ฝ๋ ํฌ์ธํธ"์ ์ ํํ ๊ฐ์ ์๋ฏธ ์ด๋ฉฐ ํฅ๋ฏธ๋ก์ด ์ถ๊ฐ ์ฌํญ์ด ์์ต๋๋ค.
๋๋ @blowdart ์ 100% ๋์ํฉ๋๋ค. ๋ฃฌ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ํผ๋์ค๋ฝ๊ณ ์๋ชป๋ ๊ฒ์ ๋๋ค. ์ ๋์ฝ๋ ํ์ค ์ ๋์ ์ฅ์ ์ฒซ ํ์ด์ง ์๋ง ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ธ ๋ฒ ์ธ๊ธํ์ง๋ง ๋ฃฌ ์ด๋ผ๋ ์ฉ์ด๋ ์ด๋์๋ ๋ํ๋์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ด ์ฝ๋ ํฌ์ธํธ๋ผ๋ฉด ๊ทธ ์ด๋ฆ์ code point ๋ก ๊ฐ๋จํด์ผ ํฉ๋๋ค.
๋ฃฌ ์ด๋ผ๋ ์ฉ์ด๊ฐ ๊ท๊ฒฉ์ ๋์ค์ง ์์๋ค๋ฉด ๊ด์ฐฎ์ ํ ๋ฐ , ๋ฌธ์ ๋ ๋ฃฌ๊ณผ ๊ด๋ จํ์ฌ 8์ฅ์์ ์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ๋ค๋ ์ ์ด๋ค. ๋จ์ํ ์๋ชป๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์ ๋ฅผ ๋ค๋ฅธ ์ฌ๋๊ณผ ์ ๊ทน์ ์ผ๋ก ํผ๋ํ๊ณ ์์ต๋๋ค.
์ ์๊ฒ
grapheme
๋จ์ด๋ ๋ ์๊ธฐ ์ค๋ช ์ ์ผ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ์ฝ 32๋นํธ ์ฝ๋ ํฌ์ธํธ๋ผ๋ฉด grapheme
๋ผ๋ ์ฉ์ด๋ ์์๊ฐ ๋ ๋ค๋ฅธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํผ๋์ค๋ฌ์ธ ๊ฒ์
๋๋ค.
๋๋ ์ข
์ข
์ฝ๋ ํฌ์ธํธ ๋ฐ์ดํฐ ์ ํ์ ์ํ์ต๋๋ค . ์ ํ
์คํธ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ ์ ์์). ์ด๊ฒ์ CodePoint
์ ๊ฐ์ด ๋ถ๋ฅด์ง ๋ง์์ผ ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌํ ์ ํ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ด์จ๋ ๋ฃฌ์ ๊ด์ ์ด ์๋๋ผ ์ฝ๋ ํฌ์ธํธ ๊ด์ ์์ ์๊ฐํ๊ณ ์์ ๊ฒ์
๋๋ค. ๋๋ ์ฝ๋ ํฌ์ธํธ ์ ๋ฃฌ์ ์์
์ ๋ณ๋ ๋ถ๋ถ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. แฑแขแพแช แแแฆ แฅแแแ แแฑแฃแณแแข/rรบna bรฉoรพ stille bryceu/runes๋ ์ฌ์ ํ ์ฌ์ฉ๋ฉ๋๋ค. ๋๋ 1๋
์ ํ ๋ฒ ์ ๋ ๋ฃฌ์ ์ฌ์ฉํด์ผ ํ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ๋์งํธ๋ณด๋ค๋ ์ํผ์ง์ ์ํฌ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋์งํธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ์ฌ๋๋ค๋ ๋ถ๋ช
ํ ์์ต๋๋ค. (์ฌ์ง์ด 20์ธ๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ WWII ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ๋ฐ ์ฌ์ฉ๋ ์ฌ๋ก๋ฅผ ์๊ณ ์์ต๋๋ค.)
์ข ์ข ์ฅํ โ ๋ฌธ์(์ด๋ฏธ .NET์์ ์ ์ฒ๋ฆฌ๋จ), ๋ฌธ์ โ ์ฝ๋ ํฌ์ธํธ, ์ฝ๋ ํฌ์ธํธ โ ์์๋ก ์ด๋ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ Grapheme ์ ์ฌ์ ํ โโ๋ ๊น๋ค๋กญ์ต๋๋ค.
ํ์ฌ๋ก์๋ ์ด๊ฒ์ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํฉ๋๋ค.
๋ค์ ๋จ๊ณ : ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ ์์ ํผ๋๋ฐฑ์ ํฌํจํ ๊ณต์์ ์ธ ์ ์์ ๋๋ค(์ ํ์ ์ค์ ์ด๋ฆ ๋ฐ Int32๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์กฐ์ ์ผ๋ก ์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ).
์ ์๋ API์ ์ด๊ธฐ ๊ตฌํ ๋ชจ๋์์ ๋ฌธ์ ๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.
https://github.com/migueldeicaza/NStack/blob/master/NStack/unicode/Rune.cs
์ ํ ์ด๋ฆ ์ง์ ๊ณผ ๊ด๋ จํ์ฌ ์ ํ์ ๋ํ ์ ํจํ ์์ ์ ์ฐพ์ ์ ์๋ ์์น์ ์ ํ๋ณ ๊ธฐ๋ฅ(์ผ๋ถ ์์ ๋ ๊ตฌํ ์ฐธ์กฐ)์ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
@migueldeicaza ๋ฅผ ๊ฒํ ํ ์ค๋น๊ฐ ๋ ๊ฒ์ผ๋ก ํ์ํ๊ธฐ ์ ์ ์ ํ์ ์ค์ ์ด๋ฆ ์ง์ ์ ๋ํ ์ฐ๋ ค์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ ํ์ ์ค๋ช ํ๋ ๋ฐ CodePoint๊ฐ ๋ ๋์ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์ฝ๋ํฌ์ธํธ๋ฅผ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ฃผ์ฅ์ด ์ฝํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋์ฐํ ์๊ฐ์ ๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์ด๊ฒ์ ๊ธฐ์กด ์ฝ๋์์ "char"์ ๋ชจ๋ ๋จ์ผ ์ฌ์ฉ์ ๋์ฒดํด์ผ ํฉ๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ ์ ํ ์ ๋์ฝ๋ ์ง์์ ๋ฐ๊ธฐ๋ฅผ ๋ฐ๋๋ค๋ฉด ๋ง์ ๋๋ค.
Rust์ฒ๋ผ "char"๋ฅผ ์ฌ์ฉํ ์ ์์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ์ฌํ๊ฒ๋ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ๊นจ์ง ๊ฒ์ด ์์ต๋๋ค.
Go๊ฐ ์ด ์ด๋ฆ์ ๋ฐ์๋ค์ธ ๊ฒ์ ์ข์ ์ ๋ก์ ๋๋ค.
๋๋ code point
๊ฐ ์ฌ๊ธฐ์ ์ฌ์ฉํ๊ธฐ์ ์ฌ๋ฐ๋ฅธ ์ฉ์ด๊ฐ ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ต์ํ ์ ๋์ฝ๋ ํ์ค์ ๋ฐ๋ผ 10FFFF(http://unicode.org/glossary/#code_point) ์ด์์ ๊ฐ์ ํฌํจํ์ง ์์ต๋๋ค.
๋๋ rune
๋ผ๋ ์ฉ์ด๋ฅผ ์ข์ํ์ง ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ ๋์ฝ๋์ ๋ค๋ฅธ ๊ณณ์์ ์ ๋ฐ์ ์ผ๋ก ํผ๋์ ์ผ๊ธฐํ ๊ธฐ์กด ์ฌ์ฉ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๊ธฐ์กด ์ฌ์ฉ์ ์ ํ๊ณผ ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ด ๊ฝค ๋๋ค๊ณ ์๊ฐํฉ๋๋ค(ํนํ 'Rune'์ด ํน์ ๊ฒ์ ๊ฐ์ฒด๋ฅผ ๋ํ๋ผ ์ ์๋ Unity์ ๊ฐ์ ๊ฒฝ์ฐ).
๊ทธ๋ฌ๋ C++ 11 char32_t
์ ํ์ ํฌํจํ๋ ์ ํ์ด๋ผ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ์ด๋ฆ๋ง ๋ค๋ฅผ ๋ฟ์
๋๋ค.
Char32
์ ๋ํด ํ ๋ง์ด ์์ต๋๋ค. ์์ ์ ์ ์ ํ์์ ํ์ ์ด๋ฆ๊ณผ ์ ์ฌํฉ๋๋ค. ์ฝ๋ ํฌ์ธํธ ์์ค์ด ์๋ ์บ๋ฆญํฐ ๊ฐ๋
์์ค์์ ์ด์ผ๊ธฐํฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ด๋ฆ์ด ์๋๋๋ค.
์ฐ๋ฆฌ๋ nint
๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ nchar
๋ ์ด๋ป์ต๋๊น?
์ ๋ก๋ nchar
๋ฐ nvarchar
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ต๋๋ค.
์ฌ๊ธฐ์ nchar
๋ ๊ตญ๊ฐ ๋ฌธ์/๊ตญ๊ฐ ๋ฌธ์์ด๊ณ nvarchar
๋ ๊ตญ๊ฐ ๋ฌธ์ ๊ฐ๋ณ/๊ตญ๊ฐ ๋ฌธ์ ๊ฐ๋ณ์
๋๋ค. ์ ๋์ฝ๋๋ฅผ ์ ์ฅํ ์ ์๋ ํ๋ ์ ํ์ ๋ฌด์์ด๋ฉฐ ์ผ๋ถ ISO ํ์ค๋ ์์ต๋๋ค. ์ด๋ ๊ฒ์ด SQL์ธ์ง ํ์คํ์ง ์์ต๋๊น?
๋ฃฌ์ ์ด ์ ๋์ฝ๋ ์ฌ์ฉ์ ๋ฌด์์ ๋๊น? ๊ทธ๊ฒ์ ๋์๊ฒ ์๋ก์ด ์์์ด๋ค.
U+16A0 ~ U+16F8
์ ๋์ฝ๋ ํ์ค์ ํน์ ์ฝ๋ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ค๋ ๋์์ ๋ช ๋ฒ ์ธ๊ธ๋์์ต๋๋ค. http://unicode.org/charts/PDF/U16A0.pdf
์ ๋ฃฌ์ด ์๋๋ผ ๋ฃฌ์ ๋๋ค.
๋ฐฑ์ ์ด๋ฆ(System.Rune ๋๋ System.Char32)์ C#์ ํฌ์๋ ๋ ์ด๋ธ๋งํผ ์ค์ํ์ง ์์ต๋๋ค.
์ฒซ์งธ: ์, ์, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ํด ๋ ๋ง์ด ๋ถํ๋๋ฆฝ๋๋ค. ๋๋ ์ด ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค. ์ฌ์ค ์ฐ๋ฆฌ๋ ์ ์ ๋์ Visual Studio์ Git ํธํ์ฑ์์ ์ฌ์ฉ์ ์ง์ ๋ฌธ์์ด ํด๋์ค์ ๋ฌธ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค(Git์ Utf-8๋ก ๋งํ๊ณ ๋ชจ๋ ๊ฒ์ ํธ๋์ค์ฝ๋ฉํ๋ ๊ฒ์ ๋งค์ฐ ๋๋ฆฝ๋๋ค).
์ ์ ๋ฉ์๋ ์ด๋ฆ์ ๋ํด ์์์ ์งง์ ์ด๋ฆ ์ง์ ์ ํผํ ์ ์์ต๋๊น? Char.IsPunctuation
๊ฐ ํ์ฌ ๋ฐฉ๋ฒ์ธ ๊ฒฝ์ฐ Rune.IsPunctuation
๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ๋ฏธ๋ฌ๋งํ ์ ์์ต๋๊น?
์ด๊ฒ์ด ๋ฐ์๋ค์ฌ์ง๋ค๊ณ ๊ฐ์ ํ๋ฉด(ํญ์ ์ํํฉ๋๋ค), ๋ณธ์ง์ ์ธ rune
๋๋ c32
๋๋ char
๋ฅผ System.Rune
๊ตฌํ์ผ๋ก ์์ ํ ๋์ฒดํ ์ ์์ต๋๊น?
uchar
unichar
๋๋ uchar
$๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ์ชฝ์ ์ ํํ๋ ์ง ์ธ์ด๋ณ ๋ณ์นญ์ ์ป์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ๊ธฐ๋ณธ ์ ํ์ ์ธ์ด ๋ณ์นญ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋งค์ฐ ์ข์ํฉ๋๋ค.
๋ํ @whoisj ์ ๋์ํฉ๋๋ค - ์งง์/์ฝ์ด๋ณด๋ค ์ ์ฒด ๋ฉ์๋ ์ด๋ฆ์ ํ์คํ ์ ํธํฉ๋๋ค.
๋ํ @whoisj ์ ๋์ํฉ๋๋ค - ์งง์/์ฝ์ด๋ณด๋ค ์ ์ฒด ๋ฉ์๋ ์ด๋ฆ์ ํ์คํ ์ ํธํฉ๋๋ค.
IMO ์ธ์ด(๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ ์ ์ฒด, ์ถ์ฝ๋ ์ด๋ฆ์ ์ ํํ๊ฑฐ๋ ์ฝ์ด(์: strcmp, memcpy ๋ฑ์ ์ฌ์ฉํ๋ C)๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
์๋๋ฉด
char
๋ฅผSystem.Rune
๊ตฌํ์ผ๋ก ์์ ํ ๋ฐ๊พธ์๊ฒ ์ต๋๊น?
๊ทธ๊ฒ์ ์๋นํ ๋ช ๋ฐฑํ ์ด์ ๋ก ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ์๋นํ ๋ช ๋ฐฑํ ์ด์ ๋ก ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์ ๋๋ค.
๋ด ์๊ฒฌ์ ๋๋ถ๋ถ ํ์ ๋ณผ์ด์๊ณ ํฌ๋ง์ ์ด์์ต๋๋ค. 16๋นํธ ๋ฌธ์ ์ ํ์ ์ฒ์๋ถํฐ ์ค์์์ต๋๋ค.
์ด๋ฆ ์ง์ ์ ์ํ๋ฉด ์์ ๋ฉ๋๋ค.
์ ๊ณต๋ API์ ๋ค๋ฅธ ์์ ๋ถ์ผ์น๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@migueldeicaza
์ ๋ฃฌ์ด ์๋๋ผ ๋ฃฌ์ ๋๋ค.
๋ฃฌ ๋ฌธ์ ๋ ํ์ฉ์ฌ, ๋ฃฌ ๋ช ์ฌ์ ๋๋ค. ๋ฃฌ ๋ฌธ์๋ ๋ชจ๋ ๋ฃฌ ๋ฌธ์์ ๋๋ค.
_Runic_์ ํ์ฉ์ฌ, _rune_๋ ๋ช ์ฌ์ ๋๋ค. ๋ฃฌ ๋ฌธ์๋ ๋ชจ๋ ๋ฃฌ ๋ฌธ์์ ๋๋ค.
"Cortana: define _'rune'_"์ด ๋ค์๊ณผ ๊ฐ์ด ํ์๋๋ ๊ฒ์ฒ๋ผ ๊ณต์ ํฉ๋๋ค.
๋ก๋ง ์ํ๋ฒณ๊ณผ ๊ด๋ จ๋ ๊ณ ๋ ๊ฒ๋ฅด๋ง ์ํ๋ฒณ์ ๋ฌธ์.
์ ์, "๋ฃฌ"์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ณผ ๋๋ง๋ค "The Runic Unicode Block"์ ๋ํด ์ด์ผ๊ธฐํ๋ ์๋ฌด๋ ์ฝ์ง ์์ ์ฌ์์ ์ด ๋ชจํธํ ์ฅ์ด ์ฆ์ ์๊ฐ๋ฉ๋๋ค.
๐ ์ด๋ฆด ์ ํจํจ์ ์ฝ์๋ ๊ธฐ์ต์ด ๋ ์ค๋ฅธ๋ค.
แแซแฆแแแฒแซแแ แซแฑแขแพแแ
๋ค, ๊ตฌ์ฒด์ ์ผ๋ก ์ฌ์์ ์๊ฐํ์ง ์์ง๋ง ์ฌ์์ด ์ฐธ์กฐํ๋ ๋ฌธ์ ์ ํ์ ์๊ฐํฉ๋๋ค.
rune
๋ผ๊ณ ํ๋ฉด ๋ง๋ฒ, ํํ์ง, ์์๊ป๋ผ ๊ฐ์ ํผ์ฆ, ๊ณ ๋ ์ธ์ด ๋ฑ์ ์๊ฐํฉ๋๋ค.
"๋ฃฌ"์ด๋ผ๋ ๋จ์ด๊ฐ ๋ณด์ด์ง ์๊ณ ์ฆ์ "์ ์ด๊ฒ์ ๋ถ๋ช ํ 16A0..16F8 ๋ฒ์์ ๊ณ ์ ํ ๊ฐ์ผ๋ก ๊ฐ์ด ์ ํ๋๋ ์ ๋์ฝ๋ 7.0 ๋ฃฌ ๋ธ๋ก์ ๋ํ๋ ๋๋ค"๋ผ๊ณ ์๊ฐํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
์ฌ๊ธฐ์์ Tanner๊ฐ ํ ๋ชฉ์๋ฆฌ๋ผ๋ ๊ฒ์ ์๊ณ ์๊ณ ์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๋ ์ฌ์ ํ "ํ์ง๋ง Miguel, ๋๋ 'rune'์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ณด๊ณ ์ฆ์ 88๊ฐ์ ๊ฐ๋ฅํ ๊ฐ๋ง ๊ฐ์ง ์ ์๋ ๋ฐ์ดํฐ ์ ํ์ด ๋ ์ฌ๋์ต๋๋ค"๋ผ๊ณ ์๊ฐํ๊ณ ์๋ค๋ ๊ฒ์ ์๋๋ค. ์ด๊ฒ์ด ๋น์ ์ด ๊ณ ๊ตฐ๋ถํฌํ๋ ๋ฌธ์ ๋ผ๋ฉด, ๋ด ํ์ /์๋งค, ๋น์ ์ ์ํ ์์์ด ์์ต๋๋ค. ๋น์ ์ ๋ ํฐ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ๊ธธ ์ ์์ต๋๋ค.
๋๋ ํ ๋ฌ์ด ์กฐ๊ธ ๋๋ ๊ธฐ๊ฐ ๋์ ํฅ๋ถ๊ณผ ๋ง์ค์์ด ๋ค์์ฌ ์ ์ ๋์ ์ด ์ค๋ ๋๋ฅผ ๋ฐ๋ผ์์ต๋๋ค. ์ง๋ ๋ฌ์ ๊ตญ์ ํ ๋ฐ ์ ๋์ฝ๋ ํ์์ ์ฐธ์ํ๋๋ฐ .NET์ ๋ค๋ฃฌ ํ๋ ์ ํ ์ด์ ์ ์์์ต๋๋ค. .NET Framework์ ์ธ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ธ๊ณํ ๊ธฐ๋ฅ์ ์ญ์ฌ๋ฅผ ๊ณ ๋ คํ ๋ ๋ฐ๋์ ๋ฒ์ง ์์ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ ๊ธด ํ์ง๋ง ์ ๋ C# ํ๋ก๊ทธ๋๋ฐ์ ์ข์ํ๊ณ ์ง์ ํ ๊ธ๋ก๋ฒ ์ปค๋ฎค๋ํฐ์์ .NET์ ์์น๋ฅผ โโ๊ฐํํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๋์ ์ผ๋ก ๋ณด๊ณ ์ถ์ต๋๋ค. ์ ๋ ์ด ์ ์์ด ๊ตญ์ ํ ์ปค๋ฎค๋ํฐ๊ฐ ์ํํธ์จ์ด์ ๋ํด ๊ธฐ๋ํ๋ ํ์ค์ ์์ฉํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ์ข์ ๋จ๊ณ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ด ์ฃผ์ ๋ ๋๋ถ๋ถ ์ ํ ์ด๋ฆ์ ๋ํด ๋ง๋คํผ์ ํ๋ ๊ฒ์ด์์ต๋๋ค. Go์ ์ค๊ณ์๋ค์ด "rune"์ด๋ผ๋ ์ด๋ฆ์ ์ ํํ ๊ฒ์ ์ฌ์ค์ด์ง๋ง ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋์ด๋ ์ด์ ๋ก ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ์ ๋๋ก ๋ฃฌ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ์์ต๋๋ค. ์กด๊ฒฝ๋ฐ๋ ํ์ค์ ๊ฐ๊น๊ฒ ๊น๊ณ ์ฌ์์ ์ผ๋ถ์ธ ์ฉ์ด๋ฅผ ์ฌ์ ์ํ๋ ค๋ ์ ์์ ๋์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ฒ๋ค๊ฐ, ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ด ์ฉ์ด๋ฅผ ๋ชจ๋ฅธ๋ค๋ ์ฃผ์ฅ์ ์ด ์ ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐ ๊ฐ์ฅ ๊ด์ฌ์ด ์๋ ๊ฐ๋ฐ์๊ฐ ์ ๋์ฝ๋ ์ฌ์์ ์ดํดํ๊ณ "๋ฃฌ"์ด ์ค์ ๋ก ๋ฌด์์ธ์ง ์ ์๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ฑฐ์ง์ ๋๋ค. ์ฉ์ด๋ฅผ ํผํฉํ๋ฉด ์กด์ฌํ ์ ์๋ ์ด์ํจ์ ์์ํด ๋ณด์ญ์์ค.
Rune.IsRune(new Rune('แ')); // evaluates to true
Rune.IsRune(new Rune('I')); // evaluates to false
๋ฌผ๋ก , ๋๋ ์๋ก์ด ์ด๋ฆ์ ์ ๊ณตํ์ง ์๊ณ ๋นํํ๋ ์ฌ์ด ๊ธธ์ ํํ์ต๋๋ค. CodePoint
์ ์ด์ ์ ์์ด ๊ฐ์ฅ ์๋ช
ํ ์ต์
์ด๋ผ๊ณ ์๊ฐํ์ง๋ง(์๋ ๋ฌธ์ ์ค๋ช
์ ๋ํ๋จ) char32
๋ ๊ธฐ์กด ๊ธฐ๋ณธ ์ ํ๊ณผ ๋ ๋ง์ ํจ๋ฆฌํฐ๋ฅผ ๊ฐ์ง๋๋ค. ๋ชจ๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ๋ฌธ์๊ฐ ์๋๋ผ๋ ๊ฒ์ ์ฃผ์ ํ์ง ๋ง์ญ์์ค.) ๋ชฉํ๊ฐ .NET์ ๋ ๋์ ์ ๋์ฝ๋ ์ง์์ ๊ตฌ์ถํ๋ ๊ฒ์ด๋ผ๋ฉด ์ ๋ ๊ทธ ๊ฒฝ๋ก๋ฅผ ์ ๋์ ์ผ๋ก ์ง์งํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ์์ ๋ฐ๋ฅด๋ ๊ฒ์
๋๋ค.
์ธ ๊ฐ์ง ์ ์:
ํด๋น Graphme ํด๋์ค๋ ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ด ์ปจํ ์คํธ์์ ์์๋ ์ค์ ๋ก ์ฒซ ๋ฒ์งธ ๋ฃฌ์ด ๊ฒฐํฉ๋์ง ์๊ณ ๋๋จธ์ง ๋ฃฌ์ด ๊ฒฐํฉ๋๋ ํ๋ ์ด์์ ๋ฃฌ(์ฝ๋ ํฌ์ธํธ) ๋ชฉ๋ก์ ๋๋ค. ์ฌ์ฉ ์ฌ๋ก๋ ๊ฐ๋ฐ์๊ฐ "๋ณด์ด๋ ๋ฌธ์" ๋ฉ์ด๋ฆฌ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด + GRAVE๋ ํ๋์ ์์๋ฅผ ํ์ฑํ๋ ๋ ๊ฐ์ ๋ฃฌ์ ๋๋ค.
๋คํธ์ํน์์ ์ฐ๋ฆฌ๋ ์ข ์ข ๋ฐ์ดํธ๊ฐ ์์ ํ์ง ์์ ์ ์๋ ๊ฐ์ฒด์ ๊ฐ์ "๋ฌธ์์ด"๋ก ๋ณํํด์ผ ํ๋ ๋ฐ์ดํธ ๋ฉ์ด๋ฆฌ๋ฅผ ์ป์ต๋๋ค(์: ์ผ๋ถ ๋ฐ์ดํธ์ ๋ํด ๋ค์์ง๋ง ๋ค์ค ๋ฐ์ดํธ ์ํ์ค์ ๋ง์ง๋ง ๋ฐ์ดํธ๋ ' t ๊ฝค ๋์ฐฉํ์ต๋๋ค). ๋ค์ค ๋ฐ์ดํธ ์ํ์ค์ ๋ง์ง๋ง ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋ ๊ฒ์ด ๋ค์ ๋ฐ์ดํธ ์ธํธ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์์ ๋ ์ ์์ ์ธ ์ํฉ์ผ๋ก ๊ฐ์ฃผ๋๋๋ก ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋ฃฌ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ํ์คํ ๋ฐฉ๋ฒ์ ๋ณด์ด์ง ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ๋์ฝ๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ์ด๊ฒ์ CodePoint๋ผ๊ณ ๋ถ๋ฅด์ญ์์ค. ์, ์ ๋์ฝ๋ ์ปจ์์์์ ์ฐจ์ด์ ์ ์ค๋ช ํ๋ ๋ฐ ๋์ฐํ ์ผ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํด๊ฒฐ์ฑ ์ ๋ช ํํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๊ฒ์ ๋ช ํํ ํ๋ ๋ฐ ๋์์ด ๋๋ ๋์ ๋ฌธ์ ๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํฉ๋๋ค.
๋๋ ๊ฒฐํฉ ์์ฒญ์์ ์ด๋์ ์์ํด์ผ ํ๋์ง, Go, Rust ๋๋ Swift ๋ชจ๋ rune, Character ๋๋ Unicode Scalar( System.Rune
์ ๋ํ ์ด๋ฆ)์ ์ด๋ฌํ API๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ์ ์๋ ๊ตฌํ์ ์ ๊ณตํ์ญ์์ค.
์์ ํด๋ฌ์คํฐ์์๋ System.Rune
์ ๋
๋ฆฝ์ ์ผ๋ก ์ถ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ ๊ฐ์น๋ฅผ ์ํด Swift๋ ์ด๋ฅผ ์ํด Character
๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ํ Swift๋ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ํ๋ฅญํ ๋ชจ๋ธ์ด ์๋๋๋ค.
๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ ์ ํ ๋ฃฌ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์์ API์ ์ํ๋ ๋ฌธ์ ์
๋๋ค. ์ฆ, ustring
๊ตฌํ๊ณผ ๋์ผํ ๊ธฐํ์ ์ฌ์ฉํ๋ System.Rune
๊ตฌํ์ ๋ณด๊ณ ์ด๋ฌํ ๋ฒํผ๊ฐ utf8 ๋ฌธ์์ด์ ๋งคํ๋๋ ๋ฐฉ์์ ํ์ธํ ์ ์์ต๋๋ค.
https://github.com/migueldeicaza/NStack/blob/master/NStack/strings/ustring.cs
API์ System.Rune
๋ฅผ ๋์
ํ ์ดํ๋ก ์์ง ์
๋ฐ์ดํธํ์ง ์์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์๋ฅผ ๋ค๋ฃน๋๋ค.
https://migueldeicaza.github.io/NStack/api/NStack/NStack.ustring.html
๋ช
๋ช
์ ๊ดํด์๋ ๋ถ๋ช
ํ Rust๊ฐ char
์์ ๊ฐ์ฅ ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ง์ณค์ต๋๋ค. ๋ ๋ฒ์งธ๋ก ์ข์ ๋ฐฉ๋ฒ์ rune
๋ก ์ด๋ํ๋ ๊ฒ์
๋๋ค. 4์๋ณด๋ค ํฌ๋ฉด ์ฌ๋๋ค์ด ์ณ์ ์ผ์ ํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋ ๊ฒ์
๋๋ค.
์ฃ์ก ํด์; CodePoint
๋ ์ ๋ง ์ข์ ์ด๋ฆ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ช
ํ๊ณ ๊ธฐ์ต์ ๋จ์ผ๋ฉฐ c p ๋ก ์๋ ์์ฑ๋ฉ๋๋ค.
IsCombining
๋ ํ์คํ ํ์ํ์ง๋ง ๊ฒฐํฉ ํด๋์ค๋ฅผ ์๋ ๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ฉฐ IsCombining
๋ IsCombining => CombiningClass != 0
๋๋ IsCombining => CombiningClass != CombiningClass.None
$์ด๋ฏ๋ก ๋๋ถ๋ถ ์คํ์
๋๋ค. ์์ ํด๋ฌ์คํฐ๋ ์ค์ ๋ก ๋ค์ ์ธ๋ถ์ ์์ง๋ง ์ถ๋ฐ์ ์ ๊ธฐ๋ณธ ํด๋ฌ์คํฐ๋ง, ์ฌ์ ๋ ฌ ๋ฑ์ ์ํ ๊ฒฐํฉ ํด๋์ค๋ฅผ ์๋ ๊ฒ์
๋๋ค.
CodePoint
๋ ์ฝ๋ ํฌ์ธํธ์ ๋ํ ์ ํ์ ๋ํ ํ๋ฅญํ ์ด๋ฆ์ด๋ฉฐ 4๊ฐ์ ๋ฌธ์๋ ๋ง์ด ์ฌ์ฉ๋๋ ๋ค๋ฅธ ์ ํ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ ํ์ด ์๋๋๋ค. string
๋ 50% ๋ ํฌ๋ฉฐ ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋์ง ์์ต๋๋ค. ๋ฌด์์๋ก ๋ฝ์ ๋ค ๊ธ์๊ฐ ๋ฐ๋์ ์ค์๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ์ด๋ฆ์ผ ๊ฒ์ด๋ค.
uint
๋ CLS ๊ท๊ฒฉ์ด ์๋๋ฏ๋ก ์์คํธ๋๊ณ๋ฅผ ๋ฎ๋ CLS ๊ท๊ฒฉ ctor๊ฐ ์์ต๋๋ค. int
๋ ํ์ํฉ๋๋ค.
์๋ฐฉํฅ ์์์ ๋ณํ์ ๊ณผ๋ถํ๋ก ์ธํด ๋์ ์ผ์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ํ ๋ฐฉํฅ์ ์๋ง๋ ๋ช
์์ ์ด์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ์ด ํ์คํ์ง ์์ต๋๋ค. ํํธ์ผ๋ก uint
/ int
๋ 0๋ณด๋ค ์๊ฑฐ๋ 10FFFF 16 ๋ณด๋ค ํฐ ๊ฐ์ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ฝ๋ ํฌ์ธํธ๋ณด๋ค ๋ ๋์ต๋๋ค. ์ซ์. ๋ค๋ฅธ ํํธ์ผ๋ก ๋๋ ๊ทธ ๋ฐ๋๋ณด๋ค ๋ ์์ฃผ ์ซ์์์ ์ฝ๋ ํฌ์ธํธ๋ก ์บ์คํธํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
uint๋ CLS ๊ท๊ฒฉ์ด ์๋๋ฏ๋ก ์์คํธ๋ ํ๋ฉด์ ๋ฎ๋ CLS ๊ท๊ฒฉ ctor๊ฐ ์์ต๋๋ค. int๋ ํ์ํ ๊ฒ์ ๋๋ค.
์๋ก์ด ๊ณ ์ ์ ํ์ด ๊ณต์ฉ ์ธ์ด์ ๋์
๋์ง ์์ ๊ฒฝ์ฐ์
๋๋ค.
JonHanna -- ์ด ์ธ ๊ฐ์ง ์์ฑ์๋ฅผ ์๋ฏธํฉ๋๊น?
๊ณต๊ฐ ์ ์ ์์์ ์ฐ์ฐ์ uint(๋ฃฌ ๋ฃฌ);
๊ณต๊ฐ ์ ์ ์์์ ์ฐ์ฐ์ Rune(char ch);
๊ณต๊ฐ ์ ์ ์์์ ์ฐ์ฐ์ Rune(๋จ์ ๊ฐ);
"uint" ๋์ "int"์ฌ์ผ ํฉ๋๋ค. AFAICT, int๋ ์ ์ฒด ์์คํธ๋(๋น BMP) ํ๋ฉด ์ธํธ๋ฅผ ์ฝ๊ฒ ๋ค๋ฃน๋๋ค.
@PeterSmithRedmond ๋ด ๋ง์ ๋ ๊ฐ์ ์์ฑ์๋ฟ๋ง ์๋๋ผ char
๋ฅผ ์ทจํ๋ ์์ฑ์์ uint
๋ฅผ ์ทจํ๋ ์์ฑ์๊ฐ ์์ด์ผ ํ๊ณ , int
๋ฅผ ์ทจํ๋ ์์ฑ์๊ฐ ์์ด์ผ ํ์ง๋ง, ๋ฌผ๋ก int
๋ ์์ด์ผ ํฉ๋๋ค. implicit
๋ ๋ฌด์์ด๊ณ explicit
๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์
๋๋ค). uint
๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ธ์ด์ ๋ํด์๋ ์๋ฌด๋ฐ ํด๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฒฐ๊ตญ ์์ฃผ ์์ฐ์ค๋ฌ์ด ๊ฒฝ๊ธฐ์
๋๋ค.
์ด๊ฒ์ด System.Char๋ฅผ ๋์ฒดํด์ผ ํ๋ ๊ฒฝ์ฐ "์ฐ์ "์ ์ํํ ์ ์์ด์ผ ํ๋ฉฐ(์ฆ, +, -, *, /์์ ==, !=, >, < ํ์คํ์ง ์์) ๋ ์ค์ํ๊ฒ๋ ์ด๊ฒ์ ๋ฆฌํฐ๋ด์ ์ง์ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์์ด์ผ ํฉ๋๋ค.
rune r = '๐'; // Ostrogothic character chose on purpose as in UTF16 will be a "surrogate pairs"
rune
๊ฐ ์๋๋ฉด ์๋ํ ์ ์๋ character
์ ๋ค๋ฅธ ๋์์ด๋ง letter
์
๋๊น?
๋ช ์ฌ
- ์ฌ๋์ด๋ ์กฐ์ง์ ๋์์ผ๋ก ํ๋ ์๋ฉด ๋๋ ์ธ์๋ ํต์ ์ผ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ฐํธ์ผ๋ก ์ ์ก๋ฉ๋๋ค.
- ๋ง์๋ฆฌ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก ์ฐ๊ธฐ ๋ฐ ์ธ์์ ์ฌ์ฉ๋๋ฉฐ ์ํ๋ฒณ์ ์ผ๋ถ์ธ ๊ธฐํธ ๋๋ ๋ฌธ์.
- ๊ทธ๋ฌํ ๊ธฐํธ๋ ๋ฌธ์๊ฐ ํฌํจ๋ ์ธ์ ์ ํ์ ์กฐ๊ฐ.
๊ทธ๊ฒ์ด ๋ฌธ์ ๋ ์ซ์์ ์ถฉ๋ํ์ง๋ง
Letter๋ ๋ฃฌ๋ณด๋ค ์ ๋์ฝ๋(์ผ๋ฐ์ ์ผ๋ก Net)์์ ํจ์ฌ ๋ ์ ํํ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ์๊ฐ์๋ ์ด๊ฒ์ ์ ๋์ฝ๋ ๋ฌธ์ ์ ํ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ์ ๋์ฝ๋์ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ์ด๋ _"์ฝ๋ ํฌ์ธํธ"_๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฝ๋ ํฌ์ธํธ . (1) ์ ๋์ฝ๋ ์ฝ๋์คํ์ด์ค์ ๋ชจ๋ ๊ฐ ์ฆ, 0์์ 10FFFF16 ์ฌ์ด์ ์ ์ ๋ฒ์์ ๋๋ค. ( ์น์ 3.4, ๋ฌธ์ ๋ฐ ์ธ์ฝ๋ฉ์ ์ ์ D10 ์ฐธ์กฐ) ๋ชจ๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ ํ ๋น๋๋ ๊ฒ์ ์๋๋๋ค. ์ฝ๋ ํฌ์ธํธ ์ ํ ์ ์ฐธ์กฐํ์ญ์์ค. (2) ์ฝ๋ํ๋ ๋ฌธ์ ์งํฉ์์ ๋ฌธ์์ ๊ฐ ๋๋ ์์น.
์๋๋ฉด ๊ทธ๋ฅ ํฌ๊ธฐํ๊ณ ์ค๋ฆฌ๋ฅผ "์ค๋ฆฌ"๋ผ๊ณ ๋ถ๋ฅด๊ณ ์ ๋์ฝ๋ ๋ฌธ์( uchar
๋ผ๊ณ ๋ ํจ)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋์ System.CodePoint
๋ฅผ ์ฌ์ฉํ๋๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์ผ์๊ฒ ์ต๋๊น?
Imho ๊ทธ๊ฒ์ ์ ๋ ์ฝ๋์ ์ฉ์ด ์ธก๋ฉด์์ ๋ ์ ์ ํ๋ฉฐ Java ์ธ๊ณ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฉ์ด๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ ๋์ ์ ๋์ฝ๋ ์ฉ์ด๋ฅผ ๋ฐ๋ฅด๋๋ก ํฉ์๋ค. .NET์ ๋ฌธ์์ด์ด char ์ปฌ๋ ์
์ด๊ณ ์ด char ์ปฌ๋ ์
์ด ์ ๋์ฝ๋ ๊ธฐ๋ฐ์ด๋ผ๋ ์ฌ์ค์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ .NET์ ์ผ๋ฐ ๋ฌธ์ ๋ฐ ๋ฌธ์์ด ๊ตฌํ ์ธก๋ฉด์์ ๋ ํฉ๋ฆฌ์ ์ด๊ณ ๋ณดํธ์ ์
๋๋ค.
์ ๋ Java์ .NET ์ธ๊ณ์์ ๋ชจ๋ ์ด์์๊ธฐ ๋๋ฌธ์ ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ํ ์ด์ ๊ตฌํ์ ์์ํ๊ฒ ์ต๋๋ค.
์ค์ ๋ก ์ด๊ฒ์๋ ๋ ๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์์ผ๋ฉฐ ๋ ๋ค ํ์ํฉ๋๋ค(@GrabYourPitchforks์ https://github.com/dotnet/corefxlab/issues/1799์ CodeUnit)
C# keyword Ugly Long form Size
----------------------------------------
ubyte <=> System.CodeUnit 8 bit - Assumed Utf8 in absence of encoding param
uchar <=> System.CodePoint 32 bit
CodeUnit
/ ubyte
๋ ๊ฐ๋ณ ๋๋น ์ธ์ฝ๋ฉ์ ๋ํ๋ด๋ ๋ฐ ์ค์ํ๊ณ Span<ubyte>
์์ ์ฌ์ฉํ์ฌ ํ
์คํธ API๊ฐ ์์ ๋ฐ์ดํธ๊ฐ ์๋ ํ
์คํธ ์ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
CodePoint
/ uchar
๋ ํฉ๋ฆฌ์ ์ธ ์ฒ๋ฆฌ์ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด .IndexOf(โค)
as ubyte
์์ฒด๋ ๋ฉํฐ๋ฐ์ดํธ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ubyte
s ์ด์์ ์ด๊ฑฐํ๋ ๊ฒ์ ์ํํ ์ ์์ผ๋ฏ๋ก ์ด๊ฑฐ์๋ uchar
๋จ์๋ก ์๋ํด์ผ ํฉ๋๋ค.
๋ ์ ์์ ๊ฒฐํฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
using System;
using System.Runtime.InteropServices;
// C# Keywords
using ubyte = System.CodeUnit;
using uchar = System.CodePoint;
using uspan = System.Utf8Span;
using ustring = System.Utf8String;
namespace System
{
public ref struct Utf8Span
{
private readonly ReadOnlySpan<ubyte> _buffer;
public Utf8Span(ReadOnlySpan<ubyte> span) => _buffer = span;
public Utf8Span(uspan span) => _buffer = span._buffer;
public Utf8Span(ustring str) => _buffer = ((uspan)str)._buffer;
public Utf8Span(ReadOnlyMemory<ubyte> memory) => _buffer = memory.Span;
// Returns the CodeUnit index, not CodePoint index
public int IndexOf(char value) => IndexOf(value, 0);
public int IndexOf(char value, int startIndex) => IndexOf(value, 0, _buffer.Length);
public int IndexOf(char value, int startIndex, int count);
public int IndexOf(char value, StringComparison comparisonType);
public int IndexOf(uchar value) => IndexOf(value, 0);
public int IndexOf(uchar value, int startIndex) => IndexOf(value, 0, _buffer.Length);
public int IndexOf(uchar value, int startIndex, int count);
public int IndexOf(uchar value, StringComparison comparisonType);
public uspan Substring(int codeUnitIndex);
public uspan Substring(int codeUnitIndex, int codePointCount);
public bool StartsWith(uchar ch) => _buffer.Length >= 1 && _buffer[0] == ch;
public bool StartsWith(ustring str) => StartsWith((uspan)str);
public bool StartsWith(uspan value) => _buffer.StartsWith(value._buffer);
public bool EndsWith(uchar ch) => _buffer.Length >= 1 && _buffer[0] == ch;
public bool EndsWith(ustring str) => EndsWith((uspan)str);
public bool EndsWith(uspan value) => _buffer.EndsWith(value._buffer);
public Enumerator GetEnumerator() => new Enumerator(this);
// Iterates in uchar steps, not ubyte steps
public ref struct Enumerator
{
public Enumerator(uspan span);
public uchar Current;
public bool MoveNext();
public void Dispose() { }
public void Reset() => throw new NotSupportedException();
}
}
public class Utf8String
{
private readonly ReadOnlyMemory<ubyte> _buffer;
public Utf8String(ustring str) => _buffer = str._buffer;
public Utf8String(ReadOnlyMemory<ubyte> memory) => _buffer = memory;
public bool StartsWith(uchar ch) => ((uspan)this).StartsWith(ch);
public bool StartsWith(ustring value) => ((uspan)this).StartsWith(value);
public bool StartsWith(uspan value) => ((uspan)this).StartsWith(value);
public bool EndsWith(uchar ch) => ((uspan)this).EndsWith(ch);
public bool EndsWith(ustring value) => ((uspan)this).EndsWith(value);
public bool EndsWith(uspan value) => ((uspan)this).EndsWith(value);
public static implicit operator uspan(ustring value) => new uspan(value._buffer);
// Returns the CodeUnit index, not CodePoint index
public int IndexOf(char value) => IndexOf(value, 0);
public int IndexOf(char value, int startIndex) => IndexOf(value, 0, _buffer.Length);
public int IndexOf(char value, int startIndex, int count);
public int IndexOf(char value, StringComparison comparisonType);
public int IndexOf(uchar value) => IndexOf(value, 0);
public int IndexOf(uchar value, int startIndex) => IndexOf(value, 0, _buffer.Length);
public int IndexOf(uchar value, int startIndex, int count);
public int IndexOf(uchar value, StringComparison comparisonType);
public ustring Substring(int codeUnitIndex);
public ustring Substring(int codeUnitIndex, int codePointCount);
public uspan.Enumerator GetEnumerator() => ((uspan)this).GetEnumerator();
}
[StructLayout(LayoutKind.Auto, Size = 1)]
public struct CodeUnit : IComparable<ubyte>, IEquatable<ubyte>
{
private readonly byte _value;
public CodeUnit(ubyte other) => _value = other._value;
public CodeUnit(byte b) => _value = b;
public static bool operator ==(ubyte a, ubyte b) => a._value == b._value;
public static bool operator !=(ubyte a, ubyte b) => a._value != b._value;
public static bool operator <(ubyte a, ubyte b) => a._value < b._value;
public static bool operator <=(ubyte a, ubyte b) => a._value <= b._value;
public static bool operator >(ubyte a, ubyte b) => a._value > b._value;
public static bool operator >=(ubyte a, ubyte b) => a._value >= b._value;
public static implicit operator byte(ubyte value) => value._value;
public static explicit operator ubyte(byte value) => new ubyte(value);
// other implicit conversions go here
// if intrinsic then casts can be properly checked or unchecked
public int CompareTo(ubyte other) => _value.CompareTo(other._value);
public override bool Equals(object other) => (other is ubyte cu) && (this == cu);
public bool Equals(ubyte other) => (this == other);
public override int GetHashCode() => _value;
public override string ToString() => _value.ToString();
}
[StructLayout(LayoutKind.Auto, Size = 4)]
public struct CodePoint : IComparable<uchar>, IEquatable<uchar>
{
private readonly uint _value;
public CodePoint(uint CodePoint);
public CodePoint(char ch);
public static ValueTuple<uchar, int> DecodeLastCodePoint(ubyte[] buffer, int end);
public static ValueTuple<uchar, int> DecodeLastCodePoint(ustring str, int end);
public static ValueTuple<uchar, int> DecodeCodePoint(ubyte[] buffer, int start, int n);
public static ValueTuple<uchar, int> DecodeCodePoint(ustring str, int start, int n);
public static int EncodeCodePoint(uchar CodePoint, ubyte[] dest, int offset);
public static bool FullCodePoint(ubyte[] p);
public static bool FullCodePoint(ustring str);
public static int InvalidIndex(ubyte[] buffer);
public static int InvalidIndex(ustring str);
public static bool IsControl(uchar CodePoint);
public static bool IsDigit(uchar CodePoint);
public static bool IsGraphic(uchar CodePoint);
public static bool IsLetter(uchar CodePoint);
public static bool IsLower(uchar CodePoint);
public static bool IsMark(uchar CodePoint);
public static bool IsNumber(uchar CodePoint);
public static bool IsPrint(uchar CodePoint);
public static bool IsPunctuation(uchar CodePoint);
public static bool IsSpace(uchar CodePoint);
public static bool IsSymbol(uchar CodePoint);
public static bool IsTitle(uchar CodePoint);
public static bool IsUpper(uchar CodePoint);
public static int CodePointCount(ubyte[] buffer, int offset, int count);
public static int CodePointCount(ustring str);
public static int CodePointLen(uchar CodePoint);
public static uchar SimpleFold(uchar CodePoint);
public static uchar To(Case toCase, uchar CodePoint);
public static uchar ToLower(uchar CodePoint);
public static uchar ToTitle(uchar CodePoint);
public static uchar ToUpper(uchar CodePoint);
public static bool Valid(ubyte[] buffer);
public static bool Valid(ustring str);
public static bool ValidCodePoint(uchar CodePoint);
public static bool operator ==(uchar a, uchar b) => a._value == b._value;
public static bool operator !=(uchar a, uchar b) => a._value != b._value;
public static bool operator <(uchar a, uchar b) => a._value < b._value;
public static bool operator <=(uchar a, uchar b) => a._value <= b._value;
public static bool operator >(uchar a, uchar b) => a._value > b._value;
public static bool operator >=(uchar a, uchar b) => a._value >= b._value;
// etc
}
}
๋ด ํ๋กํ ํ์
๊ตฌํ์์ UnicodeScalar
๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ(U+0000..U+10FFFF ๋ฒ์์ ๊ฐ ํฌํจ, ๋๋ฆฌ ์ฝ๋ ํฌ์ธํธ ์ ์ธ) ๋ฐ Utf8Char
UTF-8 ์ฝ๋ ๋จ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ง์ ์ฌ๋๋ค์ด _UnicodeScalar_ ๋์ _Rune_์ ์ ํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ณ๋ก ์ ๊ฒฝ ์ฐ์ง ์์ง๋ง "์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ"์ด๋ผ๋ ์ฉ์ด ๋ ์ ๋์ฝ๋ ์ฌ์์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฉ์ด์์ ์ง์ ํ๊ฒ ์ต๋๋ค. ;)
.NET Framework์๋ ๊ฒฐํฉ๋ ๋ ๋ถํ ํ ์ ์๋ ๋จ์ผ ๋ฌธ์์๋ฅผ ์์ฑํ๋ ํ๋ ์ด์์ ์ค์นผ๋ผ์ธ "ํ
์คํธ ์์"๋ผ๋ ๊ฐ๋
๋ ์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ์ ๋ณด ๋ MSDN ์ ์ฐธ์กฐํ์ญ์์ค. ํนํ ๋ฌธ์์ด์ ์ด๊ฑฐํ ๋ ์ฝ๋ ๋จ์( Utf8Char
๋๋ Char
), ์ค์นผ๋ผ ๊ฐ( UnicodeScalar
) ๋๋ ํ
์คํธ ์์๋ณ๋ก ์ด๊ฑฐํ ์ ์์ต๋๋ค. ํน์ ์๋๋ฆฌ์ค. ์ด์์ ์ผ๋ก๋ String๊ณผ Utf8String ๋ชจ๋์์ ์ธ ๊ฐ์ง ์ ํ์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
ํ๋กํ ํ์ ์ ๋ํ API ํ๋ฉด์ ์๋ฃ๋์ง ์์์ผ๋ฉฐ ๋น ๋ฅด๊ฒ ๋ณ๊ฒฝ๋ ์ ์์ง๋ง https://github.com/dotnet/corefxlab/tree/utf8string/src/System.Text.Utf8/System ์์ ํ์ฌ ์๊ฐ์ ๋ณผ ์ ์์ต๋๋ค. https://github.com/dotnet/corefxlab/blob/master/src/System.Text.Primitives/System/Text/Encoders/Utf8Utility.cs.
์ฝ๊ฐ ์ฃผ์ ์์ ๋ฒ์ด๋จ:
"ํ
์คํธ ์์" ๋ UAX dotnet/corefx#29์ "Grapheme Cluster Boundaries"์ ์ํด ์ ์๋ ๋ถํ ์ด์ด์ผ ํฉ๋๊น?
using System;
using System.Globalization;
class Program
{
static void Main()
{
var e = StringInfo.GetTextElementEnumerator("๐ฉ๐ปโ๐ฆ๐ผ๐จ๐ฝโ๐ฆ๐พโ๐ฆ๐ฟ๐ฉ๐ผโ๐จ๐ฝโ๐ฆ๐ผโ๐ง๐ฝ๐ฉ๐ปโ๐ฉ๐ฟโ๐ง๐ผโ๐ง๐พ");
while (e.MoveNext())
{
Console.WriteLine(e.GetTextElement());
}
}
}
์์ ๊ฒฐ๊ณผ:
๐ฉ๐ปโ๐ฆ๐ผ
๐จ๐ฝโ๐ฆ๐พโ๐ฆ๐ฟ
๐ฉ๐ผโ๐จ๐ฝโ๐ฆ๐ผโ๐ง๐ฝ
๐ฉ๐ปโ๐ฉ๐ฟโ๐ง๐ผโ๐ง๐พ
์ค์ ๊ฒฐ๊ณผ:
๐ฉ
๐ป
โ
๐ฆ
๐ผ
๐จ
๐ฝ
โ
๐ฆ
๐พ
โ
๐ฆ
๐ฟ
๐ฉ
๐ผ
โ
๐จ
๐ฝ
โ
๐ฆ
๐ผ
โ
๐ง
๐ฝ
๐ฉ
๐ป
โ
๐ฉ
๐ฟ
โ
๐ง
๐ผ
โ
๐ง
๐พ
UnicodeScalar
๋ ์ฌ์ ํ ์
๋ ฅํ๊ธฐ ๋งค์ฐ ์ฝ์ต๋๋ค. u s c ์คํ์ด์ค (์๋ ์์ฑ) ๊ทธ๊ฒ์ด ์ ํํ๊ณ ๊ฐ์ฅ ์๊ธฐ ์ค๋ช
์ ์ธ ์ฉ์ด์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ป๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋๋๋ค.
@ufcpp ์ข์ ์ง์ ์ ๋๋ค. ์ด์ ๋ํ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์์ ๋กญ๊ฒ ์ฌ์ญ์์ค. ํธํ์ฑ ์ด์ ๋ก ๋์์ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด ํด๋น ์ ํ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ์์ ์ค์ํ๋ ์์ ์ด๊ฑฐ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
ubyte
/ uchar
์(๋) ํผ๋์ค๋ฝ์ต๋๋ค. ushort
/ uint
/ ulong
๋ก ์ค์ ๋ ๊ท์น์ ๋ฐ๋ผ unsigned char
/ unsigned byte
์ฒ๋ผ ์ฝ์ต๋๋ค. char8
/ u8char
๋ฐ char32
/ u32char
๊ฐ ๋ ๋ช
ํํ ๊น์?
์ด์จ๋ UTF-8 ์ฝ๋ ๋จ์ ๋ฐ ์ฝ๋ ํฌ์ธํธ๊ฐ ๋ค์๊ณผ ๊ฐ์์ง ์ฌ๋ถ์ ๋ํด ์๋ชป ์ ๋ ฌ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
byte
, int
์ ๊ฐ์ .NET์ ์ ์์ค ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ํDateTime
, Guid
์ ๊ฐ์ ๊ธฐ์กด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ก/์์ ๋ณํํ ๋ฐ์ดํฐ ํ์๊ทธ๋ฐ ๋ค์ ํด๋น ๊ฒฐ์ ์ ๋ฐ๋ผ ์ฝ๋ ํฌ์ธํธ ๊ด๋ จ API๋ฅผ ์ด๋ป๊ฒ ๋ ธ์ถํฉ๋๊น?
์ต์
1์ C++17๊ณผ ๊ฐ์ด char8, char16 ๋ฐ char32 ํ๋ฆฌ๋ฏธํฐ๋ธ(๋ฐ ์๋ฐ๋๋ u8string, u16string ๋ฐ u32string)๋ฅผ ํตํด ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ rune
์ธ char32๋ ์๋ชป๋ ์ด๋ฆ์
๋๋ค. ์ด๋ฏธ char16์ด char
์ด๊ณ char8
์ ๋ํ ์ธ ๋ฒ์งธ ์ด๋ฆ๋ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ต์
2๋ byte ๋ฐ int/uint๊ฐ UTF ์ฝ๋ ๋จ์ ๋ฐ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ ์ฅํ๊ธฐ์ '์ถฉ๋ถํ' ์ข๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ฌธ์์ด์ด UTF-16์ผ๋ก ์ ์ง๋จ์ ์๋ฏธํฉ๋๋ค. CodePoint
/ rune
๋ ์ด์ง ํํ์ด ์๋ Code Point
์๋ฏธ๋ก ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๋ฉฐ IO์ฉ์ด ์๋๋๋ค .
IMO UTF-8/UTF-32๋ ๋ฐ์ดํฐ ํ์์ผ ๋ฟ์
๋๋ค(์ต์
2). ๋ฐ์ดํฐ(byte/int)๋ก ์ทจ๊ธํ์ญ์์ค. CodePoint
๋ $#$ int
$#$๋ณด๋ค DateTime
๋๋ Guid
(๋ค๋ฅธ ์๋ณ์*)์ ๋น์ทํฉ๋๋ค. ์ ์์ค ๊ธฐ๋ณธ ์ ํ์ด ์๋๋ฉฐ IO์์ ์ง์ ์ง์๋์ง ์์ต๋๋ค. (์ฆ, BinaryWriter) ๋ด์ฅ ํจ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
@miyu corefxlab ์์ ๊ฐ์ ธ์ฌ ํ๋กํ ํ์
์ ์ต์
1์ ๋ ๊ฐ๊น์ต๋๋ค. ์ฝ๋ ๋จ์๋ฅผ ๋ํ๋ด๋ ํน์ ๋ฐ์ดํฐ ์ ํ์ด ์์ผ๋ฉฐ ์ด๋ฌํ ๋ฐ์ดํฐ ์ ํ์ ํ
์คํธ ๋ฐ์ดํฐ์ ๋ด๋ถ ํํ์ ์ํ ๊ฒ์ด๋ฉฐ ์ ์ ์ ํตํด ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. (๋น์ ์ด ์ง์ ํ๋ฏ์ด .NET์ ์ค๋๋ ์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค. System.Char
๋ UTF-16 ๋ฌธ์์ด์ ์ฝ๋ ๋จ์์ด์ง๋ง System.Char
๋ ์ ์ ์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.)
๋ํ byte[]
/ Span<byte>
/ ๋ฑ(๋ชจ๋ ๋ฐ์ดํฐ์ ์ด์ง ํํ์ด๋ฉฐ I/O์ ์ ํฉ)๊ณผ Utf8String
์ ๊ฐ์ ๊ธฐ๋ณธ ์ ํ ๊ฐ์ ๋ณํํ๋ API๊ฐ ์์ต๋๋ค. String
/ Guid
/ etc. ์ด๋ค ์ค ์ผ๋ถ๋ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํฉ๋๋ค. ์๋ฅผ ๋ค์ด, i/o์์ ์ฌ์ฉํ๊ธฐ ์ํด ReadOnlySpan<byte>
๋ฅผ ๋ฐํํ๋ ํธ๋ฆฌํ Utf8String.Bytes
์์ฑ์ ๋
ธ์ถํ ์ ์์ผ๋ฉฐ ์ด ์์ฑ getter๋ O(1) ๋ณต์ก์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค. String
์ ํ์๋ ์ด๋ฌํ ์์ฑ์ ๋์
ํ์ง ์๊ฒ ์ง๋ง String.ToUtf8Bytes()
ํธ์ ๋ฉ์๋๊ฐ ์๋ค๊ณ ์์ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Utf8String.Bytes
์์ฑ์ด ์๋๋ผ๋ Utf8String
์ธ์คํด์ค๋ฅผ ์ง์ ์ด๊ฑฐํ๋ ์์ ์ ํ์ byte
๊ฐ ์๋๋๋ค. Utf8CodeUnit
(์ด๋ฆ ๋ฏธ์ ) ๋๋ UnicodeScalar
์ค ๊ฐ๋ฐ์๊ฐ ๋น๋ํ๋ ค๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ ํ์ ๋ ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์
๋๋ค.
๋ฐ๋ณด ๊ฐ์ ์์ด๋์ด - wchar
(_wide char_)๋ ์ด๋ป์ต๋๊น? ์ค๋๋ ๋๋ถ๋ถ์ C ๋ฐ C++ ์ปดํ์ผ๋ฌ ํ๊ฒฝ(Windows ์ธ๋ถ)์ ์ด๋ฏธ wchar_t
๋ฅผ ์ฌ์ฉํ์ฌ 32๋นํธ ์ฝ๋ ๋จ์์ ํด๋นํ๋ ๊ธฐ๋ฅ์ ๋ํ๋
๋๋ค. Windows๋ wchar_t
๊ฐ 16๋นํธ ์ ํ์ผ๋ก ์ ์๋ ์ฃผ๋ชฉํ ๋งํ ์์ธ์ด์ง๋ง ์ค๋๋ Windows์์ p/invokeํ๋ ๊ฐ๋ฐ์๋ ์ด๋ฏธ .NET char
๊ฐ์ ๋นํธ ๋๋น ์ฐจ์ด๋ฅผ ์ธ์ํ๊ณ ์์ด์ผ ํฉ๋๋ค. char
.
type/keyword wchar
๋ ์ฐ๋ฆฌ์ ๋ช
๋ช
๊ท์น์ ์๋ฐํ์ง๋ง ๊ณ ๋ ค๋ฅผ ์ํด ์ด๊ฒ์ ๋์ก์ต๋๋ค.
์ด๋ฆฌ์์ ์์ด๋์ด -
wchar
(์์ด๋ ๋ฌธ์)๋ ์ด๋ป์ต๋๊น?
๋๋ฅผ ์ํด ์ผํ๋ค
์ ํ / ํค์๋
wchar
๋ ๋ช ๋ช ๊ท์น์ ์๋ฐํฉ๋๋ค. ...
์งง์ C# ์ธ์ด ํค์๋๋ฅผ ์ป์ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
https://github.com/dotnet/apireviews/pull/64#discussion_r196962756 ์ด๋ฌํ ์ ํ์ ๋ํ ์ธ์ด ํค์๋๋ฅผ ๋์ ํ ๊ฐ๋ฅ์ฑ์ ๊ทนํ ๋ฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ์ ํ์ ๋ฌธ๋งฅ์ ์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค(์ฆ, ํค์๋๊ฐ ๋ํ๋ด๋ ์ ํ์ด ์๋๋ผ ํด๋น ์ ํ์ ๋ฐ์ธ๋ฉํด์ผ ํ๋ ํค์๋์ ์ด๋ฆ).
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ข์ ๊ฒ์ ์ํ๋ค๋ฉด... ์๋ฅผ ๋ค์ด NotLotsOfCapitalFullWords
...
๋๋ ์ผ๋ฐ์ ์ผ๋ก .NET์ ๋ช
๋ช
๊ท์น์ ์ข์ํ์ง๋ง ๊ธด ์ด๋ฆ์ ๋ณธ์ง์ ์ผ๋ก ์ ๋ค๋ฆญ ๋ฐ ๋ฃจํ ๋ณ์๋ก๋ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ int
์ ๋ํด ์ฝ๊ฐ ๊ณต๊ฒฉ์ ์
๋๋ค.
์๋ฅผ ๋ค์ด ์๋ฌด๋ ํ์ง ์๋๋ค
foreach (Int32 i in list)
{
// ...
}
๊ทธ๋ค์ ํ ? (ํ์คํ...)
foreach (UnicodeScalar us in str)
{
// ...
}
ํจ์ฌ ๋ ๋์๋ค
foreach (wchar c in str)
{
// ...
}
๊ด์ฐฎ์ ๋ณด์ด๋๋ฐ...
rune
, wchar
๋ฐ uchar
(๋ค๋ฅธ ์ค๋ ๋์์ ์ ์๋จ) ๋ชจ๋ ๋์๊ฒ ์ข๊ฒ ๋ค๋ฆฝ๋๋ค. string
์ ๋๋ฃ๋ฅผ ์ํ ์ ์ ์ฌํญ์ด ์์ต๋๊น? wstring
, ustring
๋๋ ๊ธฐํ?
... C# ์ธ์ด ํค์๋๋ฅผ ์ป์ง ๋ชปํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ฌผ๋ก , ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค์ ํค์๋๊ฐ ์๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ง๋ง, ์ด๊ฒ์ด ๋ฏธ๋์ ๋ฌธ์์ด ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ผ๋ฉด ํค์๋๊ฐ ์๋ ๊ฒ์ ์ ์งํ์ง ์์ ๋ฟ๋ง ์๋๋ผ ์ฑํ์ ๋ํด ๋ช ๋ฐฑํ ์ ๋์ ์ ๋๋ค.
/CC @MadsTorgersen @jaredpar
C# ์ธ์ด ํค์๋๋ฅผ ์ป์ง ๋ชปํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ ํค์๋๋ 100% ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๊ณ ์์ต๋๋ค. ์ด๋ค ๋จ์ด๋ฅผ ์ ํํ๋ ํ๋ก์ ํธ์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉ๋๋ ์ด๋ฆ ์ ํ์ ๊ฐ์ง ํ์ฌ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์ผํ ์ต์
์ ๋ฌธ๋งฅ ํค์๋์
๋๋ค: ์๋ฅผ ๋ค์ด var
.
๋๋ ์ด๊ฒ์ ์ํด ๋ฌธ๋งฅ ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์๊ฐ๋ฆฐ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ธฐ์กด ์ ํ ํค์๋( int
, string
๋ฑ ...)๋ ์ค์ ์ ํ ์ด๋ฆ( Int32
, String
)๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ด์ ์ด ์์ต๋๋ค.
string
: ์ด๊ฒ์ ์ปดํ์ผ๋ฌ๊ฐ corelib๋ก ์๋ณํ๋ ์ด์
๋ธ๋ฆฌ์ System.String
์ ํ์ ๋ํ๋
๋๋ค. ์ด ์ด๋ฆ์๋ ๊ด๋ จ๋ ๋ชจํธ์ฑ์ด ์์ต๋๋ค.String
: ์ปดํ์ผ๋ฌ๊ฐ ์ด ์ ํ์ ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๊ฒ๊ณผ ๊ฐ์ ์ ํ์ด๋ฉฐ ์ ์ํ ์ ํ๊ณผ ๋์ผํ ์กฐํ ๊ท์น์ ๋ชจ๋ ๊ฑฐ์นฉ๋๋ค. string
์ ๊ฐ์ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค.์ฌ๊ธฐ์ ๋ฌธ๋งฅ ํค์๋๋ฅผ ๋์
ํ๋ฉด rune
๋ ๋ค์ ์ค ํ๋๊ฐ ๋ ์ ์์ต๋๋ค.
System.Rune
์ ํGo
์ ๋ํด ์ฝ์ ๋ ์ ์ํ rune
์ ํ์
๋๋ค.rune
String
๋ชจํธํ๋ฏ๋ก ๋ฌธ๋งฅ ํค์๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ํ์คํ ์ด์ ์ ์์ต๋๋ค.
BTW: ์ด๊ฒ์ด ๋ฐ๋ก String
string
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์
๋๋ค ๐
BTW: ์ด๊ฒ์ด
String
string
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋๋ค.
์ฌ๋๋ค์ด ์ธ์ด ํค์๋๋ฅผ ์ํ๋ค๊ณ ์๊ฐํ๋ 99%์ ์ด์ ์ ๋๋ค. ๋๋จธ์ง 1%๋ "๋ ์ข์ ๋ณด์ธ๋ค"๋ ๊ฒ์ ๋๋ค ๐
"rune" ํค์๋์ ๋ํ ๊ฐํ ์ซ์ด์์ ๋ํด ์์ง์๊ฐ๋ฝ์ ์๋๋ก ๋ด๋ฆฌ์ญ์์ค.
๋ ๋์ ๋จ์ด๋ ๊ธ๋ฆฌํ์ ๋๋ค. ์ด๋ฏธ ํ์ดํฌ๊ทธ๋ํผ์์ ์์ ๊ธฐํธ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฃฌ์ ์์ด๋ฌ๋ํ๊ฒ๋ ์ ๋์ฝ๋๋ก ์ ์๋ ํน์ ์ ํ์ ๊ธ๋ฆฌํ์ ๋๋ค. Go๋ฅผ ์ ํ ๊ธฐ์ ๋ก ์ธ๊ธํ๋ ๊ฒ์ ๋ค์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค. ๋ฃฌ์ ๋ํ ์ ํ ๊ธฐ์ ์ ์๊ธฐ 150๋ ์ ์์ฑ๋ ์ค์ ๋ฌผ๋ฆฌ์ ๋ฃฌ ์คํค์ ๋๋ค. ๋ ๋๋ชฌ๋์ ๋๊ตฐ๊ฐ๊ฐ ์๊ฐํ๋ ๋ฃฌ์ด ์๋๋๋ค. .NET์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ค๊ณ๋ API ํ๋ฉด์ด ์๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ด ๊ธฐ์กด ๊ฐ๋ ์ ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ฌธ ์ผ์ ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ด์ ํ API ์ด๋ฆ ์ง์ ์ ๋๋ฌธ ์์ธ์ด๋ฉฐ ๋ถ๋ง์ ํ๋ช ํ๊ณ ์ถ์ต๋๋ค.
๋ ๋์ ๋จ์ด๋ ๊ธ๋ฆฌํ์ ๋๋ค. ์ด๋ฏธ ํ์ดํฌ๊ทธ๋ํผ์์ ์์ ๊ธฐํธ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌธ์ ๋ "Glyph"๊ฐ ์ ๋์ฝ๋๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ก ๋ ๋๋งํ ๋ ์ฌ์ฉ๋๋ ์ฉ์ด์ ๋๋ค(์ถ์ฒ: utf8everywhere.org ).
๊ธ๋ฆฌํ
๊ธ๊ผด ๋ด์ ํน์ ๋ชจ์์ ๋๋ค. ๊ธ๊ผด์ ์ ํ ๋์์ด๋๊ฐ ๋์์ธํ ๊ธ๋ฆฌํ ๋ชจ์์ ๋๋ค. ์ผ๋ จ์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ง์ ๋ ๊ธ๊ผด ๋ด์์ ์ผ๋ จ์ ๊ธ๋ฆฌํ๋ก ๋ณํํ๋ ๊ฒ์ ํ ์คํธ ์ ฐ์ดํ ๋ฐ ๋ ๋๋ง ์์ง์ ์ฑ ์์ ๋๋ค. ์ด ๋ณํ์ ๋ํ ๊ท์น์ ๋ณต์กํ๊ณ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ์ ๋์ฝ๋ ํ์ค์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
Go๋ฅผ ์ ํ ๊ธฐ์ ๋ก ์ธ๊ธํ๋ ๊ฒ์ ๋ค์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค.
Utf-8์ ์์ฑํ ๋ Rob Pike ๋ฐ Ken Thompson์ด๋ผ๋ ์ฉ์ด ์ฌ์ฉ https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
Rob Pike๋ ํ์ฌ Go์์ ์์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฃฌ์ ์์ด๋ฌ๋ํ๊ฒ๋ ์ ๋์ฝ๋๋ก ์ ์๋ ํน์ ์ ํ์ ๊ธ๋ฆฌํ์ ๋๋ค.
๋ฃฌ ๋ฌธ์๋ ์ ๋์ฝ๋๋ก ์ ์๋์ง๋ง ๋ฃฌ ๋ฌธ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ฃฌ ๋ฌธ์๋ ์ ๋์ฝ๋๋ก ์ ์๋์ง๋ง ๋ฃฌ ๋ฌธ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ ํํ ์ง์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ต์ ์ ๋์ฝ๋ ์ฌ์(http://www.unicode.org/versions/Unicode11.0.0/UnicodeStandard-11.0.pdf)์๋ "rune"์ ๋ํ 37๊ฐ์ ์กฐํ์๊ฐ ์์ต๋๋ค(36๊ฐ๋ง ์ ํจํฉ๋๋ค. , ๋ง์ง๋ง์ ๋ ํฐ ๋จ์ด์ ์ผ๋ถ์ด๋ฉฐ ํญ์ ๋ฃฌ ๋ฌธ์์ ๊ฐ๋ณ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ ํํ ์ง์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ต์ ์ ๋์ฝ๋ ์ฌ์์๋ "rune"์ ๋ํ 37๊ฐ์ ํํธ๊ฐ ์์ต๋๋ค.
๋๊ธฐ๋ฅผ ์ค๋ช ํ๋ ๋ณธ๋ฌธ์์; ๋ฌธ์ ์ด๋ฆ์ด๋ ํ ์คํธ ๋ธ๋ก ์ด๋ฆ์ ์์(๋ฃฌ ๋ฌธ์ ๋ฐ ๋ฃฌ ๋ฌธ์)
๋๊ธฐ๋ฅผ ์ค๋ช ํ๋ ๋ณธ๋ฌธ์์; ๋ฌธ์ ์ด๋ฆ์ด๋ ํ ์คํธ ๋ธ๋ก ์ด๋ฆ์ ์์(๋ฃฌ ๋ฌธ์ ๋ฐ ๋ฃฌ ๋ฌธ์)
์ข์, ๊ณต์ ํด. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ํ์ฌ ์ ๋์ฝ๋ ์ฌ์์ด "๋ฃฌ"์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ ์ํ์ง ์๊ณ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ "๋ฃฌ ๋ฌธ์"๋ฅผ ์ค๋ช ํ๋ ์ ๋ณด ํ ์คํธ๋ฅผ ์ํ ๋ฌธ์ ๋ก ๋์๊ฐ๋๋ค.
๊ณต์์ ์ผ๋ก ์ ์ํ๊ณ ์ฌ๋ฌผ์ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ "์ฝ๋ ํฌ์ธํธ"์ "์ฝ๋ ๋จ์"์ ๋๋ค.
์งง์ ํ์๊ฐ ์๊ฑฐ๋ ์ฌ์ฉ๋ฒ์ด ์ถ์ ํด์ง๋๋ค.
int CountCommas(string str)
{
int i = 0;
foreach(UnicodeCodePoint c in str.AsUnicodeCodePoints())
{
if (c == ',') i++;
}
}
string Trim(string str)
{
int end = str.Length - 1;
int start = 0;
for (start = 0; start < Length; start++)
{
if (!UnicodeCodePoint.IsWhiteSpace(str.GetUnicodeCodePointAt(start)))
{
break;
}
}
for (end = Length - 1; end >= start; end--)
{
if (!UnicodeCodePoint.IsWhiteSpace(str.GetUnicodeCodePointAt(start)))
{
break;
}
}
return str.SubString(start, end);
}
๋
int CountCommas(string str)
{
int i = 0;
foreach(Rune c in str.AsRunes())
{
if (c == ',') i++;
}
}
string Trim(string str)
{
int end = str.Length - 1;
int start = 0;
for (start = 0; start < Length; start++)
{
if (!Rune.IsWhiteSpace(str.GetRuneAt(start)))
{
break;
}
}
for (end = Length - 1; end >= start; end--)
{
if (!Rune.IsWhiteSpace(str.GetRuneAt(start)))
{
break;
}
}
return str.SubString(start, end);
}
๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ฉด CodePoint.IsWhiteSpace
๋ฐ str.GetCodePointAt
๋ก ๊ฐ ๊ฒ์ด์ง๋ง Rune
๋ ์ฌ๋ฏธ์๊ณ ์๊ด ์์ต๋๋ค.
@jnm2 ๋ฌธ์์ด์ ๊ดํด์๋ GetCodePointAt
๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋๋ฌด ๋ชจํธํฉ๋๋ค. char
๊ฐ ํด๋น ์ธ๋ฑ์ค์ ์๊ธฐ๋ฅผ ์ํ๋์ง ์ฌ๋ถ(๋ชจ๋ char
s - ์ง์ ์ด๋ฃจ์ง ์์ ๋๋ฆฌ์๋ ์ ํจํ ์ฝ๋ ํฌ์ธํธ์ด๊ธฐ ๋๋ฌธ์) ๋๋ ์ค์นผ๋ผ / ํด๋น ์ธ๋ฑ์ค์์ ๋ฐ์ํ ๋ฃฌ.
@GrabYourPitchforks GetRuneAt
๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๊น, ์๋๋ฉด ๋ ๋ค ์๋ฏธ๊ฐ ์๋ค๊ณ ๋ง์ํ์ญ๋๊น?
@jnm2 ์ ๋ ์ด ์๋๋ฆฌ์ค์์ ํนํ CodePoint
๊ฐ ๋๋ฌด ๋ชจํธํ๋ค๊ณ ๋งํ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ์๋ ์ด๋ฆ GetXyzAt
์ ๊ฒฐ๊ตญ ๋ค์ด๊ฐ๋ ์ ํ ์ด๋ฆ Xyz
์ ์ผ์นํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ด์ ํต์ฌ ๊ตฌํ์ด ์ฒดํฌ์ธ๋์์ต๋๋ค(https://github.com/dotnet/coreclr/pull/20935 ์ฐธ์กฐ). corefx์ ์ ํํ ์๊ฐ์ ์ฃผ๋ฉด https://github.com/dotnet/corefx/pull/33395๋ฅผ ํตํด ref API๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋๊ฑฐ๋ ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋ ๋๋ก ํด๊ฒฐํ์ญ์์ค.
๋๋ ๋๊ตฐ๊ฐ์๊ฒ ์ํฅ์ ๋ฏธ์น๊ฑฐ๋ ๊ธฐ๋ก์ ์ํด ๋ฌด์์ด๋ ๋ณ๊ฒฝํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง ์์ต๋๋ค.
๋ ๋์ ๋จ์ด๋ ๊ธ๋ฆฌํ์ ๋๋ค. ์ด๋ฏธ ํ์ดํฌ๊ทธ๋ํผ์์ ์์ ๊ธฐํธ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌธ์ ๋ "Glyph"๊ฐ ์ ๋์ฝ๋๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ก ๋ ๋๋งํ ๋ ์ฌ์ฉ๋๋ ์ฉ์ด์ ๋๋ค(์ถ์ฒ: utf8everywhere.org ).
"๋ฃฌ"์ ์ ๋์ฝ๋๋ ํธ๋์ง์คํฐ, ๋ง์ดํฌ๋ก์ํํธ, ์คํ ์์ค๊ฐ ์กด์ฌํ๊ธฐ ํจ์ฌ ์ด์ ๋ถํฐ ์ญ์ฌ๋ฅผ ํตํ์ด ์ฒ ๋ ์ด ๋๋ ๊ธฐ๊ฐ ๋์ ์ฌ์ฉ๋ ์ฉ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ถ๋ก ์ ๋ฃฌ๋ ์ง์ํ์ง ์์ต๋๋ค. ์ ์ด๋ ๊ทธ๊ฒ์ ๋ถ๋ช ํ ์ผ๊ด์ฑ์ด ์๋ ๋ค๋ฅธ ์ ์์ ๋ค๋ฅธ ํ์ค์ ์์๋ก ์ ์ฉํ๋ ์ฌ๋๋ค์ด ์์์ ๋ํ๋ ๋๋ค. ๊ทธ๋์ ์๋ง๋ ๊ฐ์ฅ ์ผ๊ด๋ ์ฃผ์ฅ๋ณด๋ค๋ ๋๊ฐ ๋จผ์ ์๊ฑฐ๋ ๊ฐ์ฅ ํฐ ์๋ฆฌ๋ฅผ ๋๋์ง์ ๊ดํ ๊ฒ์ผ ์ ์์ต๋๋ค. ์ ๊ฐ ๋ฌด์์ ์๋๊น? ๋๋ ๊ทธ ๊ณผ์ ์ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๋ฆ์์ง๋ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
Go๋ฅผ ์ ํ ๊ธฐ์ ๋ก ์ธ๊ธํ๋ ๊ฒ์ ๋ค์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค.
Utf-8์ ์์ฑํ ๋ Rob Pike ๋ฐ Ken Thompson์ด๋ผ๋ ์ฉ์ด ์ฌ์ฉ https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
Rob Pike๋ ํ์ฌ Go์์ ์์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Go์ Rob Pike๋ ์ด ์ฃผ์ ์ ๋ํด ์๋์ ์ผ๋ก ์๋ก์ด ์ฌ๋์ ๋๋ค. ์ฌ์ค ๊ทธ๋ค์ ์๊ฒฌ์ ์ญ์ฌ์ ์ผ๋ก๋ ๋์ค ๋ฌธํ๊ณผ ์ฌํ์์ ๋ฃฌ์ด ๋ฌด์์ธ์ง ์ ์ํ๋ค๋ ์ ์์ ๋ค์ ๋ถ์ ์ ํฉ๋๋ค. Rob์ ์์ผ๋ก ๋ฃฌ ์คํค์ ๋ง์น๋ก ๋๋๋ฆฌ์ง ์์์ผ๋ฏ๋ก ๋ฃฌ์ด ๋ฌด์์ธ์ง ์ ์ํ ์๊ฒฉ์ด ๊ฑฐ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฐ ๋ฃฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์ฐ๊ฑฐ๋ ์ฝ์ ์๋ ์์ง๋ง ๋ด ์ถ์ธก์ ๋๋ค. ๊ธฐ๊ปํด์ผ ๊ทธ๋ ์ธ์ฝ๋ฉ์ ํตํด ๊ทธ ๊ฐ๋ ์ ํฌ์ฐฉํ ์ ์์ง๋ง ํ์, ์๋์ด ๋ฌธ์ ๋๋ ํ๊ธ ๋๋ ์๋ ์ผ๊ตด์ด ๋ฃฌ์ด๊ฑฐ๋ "์ฝ๋ ํฌ์ธํธ"์ธ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ด ์ด์ ๋ฃฌ์ด๋ผ๊ณ ๋ ๋งํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๋ฐ ๊ฒ. ์ด ์ฉ์ด๋ฅผ ๊ฑฐ์ ๋ฌด๋กํ๊ฒ ์ง๋ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ชจ๋ ๊ฒ์ด ๋ฃฌ์ด ๋ ์ ์์ต๋๋ค. ์ฆ, ๋ฃฌ์ ํ ์คํธ ์ธ์ฝ๋ฉ ์์ญ์์ ๋ํดํ ๊ฒ์ ๋ํ๋ด๋ 4๊ธ์ ์์ผ๋์นด๋ ์ฉ์ด์ ๋ถ๊ณผํฉ๋๋ค.
๋ฃฌ์ ์์ด๋ฌ๋ํ๊ฒ๋ ์ ๋์ฝ๋๋ก ์ ์๋ ํน์ ์ ํ์ ๊ธ๋ฆฌํ์ ๋๋ค.
๋ฃฌ ๋ฌธ์๋ ์ ๋์ฝ๋๋ก ์ ์๋์ง๋ง ๋ฃฌ ๋ฌธ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์ ๋์ฝ๋๋ ๋ฃฌ์ด๋ ๋ฃฌ์ด ๋ฌด์์ธ์ง ์ฌ์ ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ด ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด, ๊ทธ๋ค์ ๊ทธ๋ค์ ์๋ฌด๋ฅผ ์ด๊ณผํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ๋์ค์๊ฒ ๋ฃฌ์ด ๋ฌด์์ธ์ง ๋งํ ์ผ์ด ์์ต๋๋ค. ์ฌ์ค ๊ทธ๋ค์ ์๋ก์ด ์ธ์ด๋ ๋ฌธ์ ์ฒด๊ณ๋ฅผ ์ ์ํ๋ ์ฌ์ ์ด ์ ํ ์์ต๋๋ค. ์ฒ ๋ ์ด ์ง๋ ์ง๊ธ ๋ถ๋ช ํ ๊ณผ์คํ ์ฉ์ด๊ฐ ๋ ๋จ์ด๋ฅผ ์ฐจ์ฉํ๊ณ ์๋ก์ด ๊ฐ๋ ์ ์๊ฐํด๋ธ ๊ฒ์ฒ๋ผ ํํธ์ฑ์ ์ง๋ฅด๊ธฐ๋ง ํ ์๋ ์์ต๋๋ค. ๋ฃฌ ๋ฌธ์๋ ๋ฃฌ๋ง์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๋ฃฌ์ ์ด๋ฏธ ํ๋ฆฝ๋ ๊ฐ๋ ์ ๋๋ค. ๊ธธ๊ฑฐ๋ฆฌ์์ ์๋ฌด์๊ฒ๋ ๋ฃฌ์ด ๋ฌด์์ธ์ง ๋ฌป๋๋ค๋ฉด ๊ทธ๋ค์ ์ ๋์ฝ๋๋ฅผ ์๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค.
์์ ๋ชจ๋ ๋ฌธ์ ์ธ์๋ ๋ฃฌ์ ์ต์ ์ ๋ถ๋ถ์ธ ๋น์ฝํ ์์ ์ ๋๋ค. ๊ทธ๊ฒ์ ์๋ฌด๊ฒ๋ ๋ช ํํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ์์ค์ ํผ๋์ ๋ํ ๋ฟ์ ๋๋ค. ์ด ์ฃผ์ ๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ๋ฃฌ์ด ํน์ ๋ฌธํ๊ถ์์ ์ฌ์ฉ๋๋ ์ญ์ฌ์ ์ฐ๊ธฐ ์ฒด๊ณ๋ผ๋ ๋งฅ๋ฝ์ ์ดํดํ๊ธฐ ๋๋ฌธ์ ๋ช ํํ ์ค๋ช ๊ณผ ์ฝ๊ธฐ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋์ด์ผ ํฉ๋๋ค. "๋ฃฌ์ ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ์ ๋๋ค." "ํ์ง๋ง ์ ๊ทธ๊ฒ์ ์ฝ๋ ํฌ์ธํธ๋ผ๊ณ ๋ถ๋ฅด์ง ์์ต๋๊น?" "๊ธ์, ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์."๋๋ "๋๊ตฐ๊ฐ ๋ฃฌ์ ์ข์ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค." ๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ตฐ๊ฐ๋ 9๊ธ์๊ฐ 4๊ธ์์ ๋นํด ๋๋ฌด ๋ง๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์(์ธํ ๋ฆฌ์ผ์ค๋ก ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๊ณ Java Kingdom Of Nouns์ ๋นํ๋ฉด ์๋ฌด๊ฒ๋ ์๋์๋ ๋ถ๊ตฌํ๊ณ ) ์ด์ ์ฐ๋ฆฌ๋ ์ด ํผ๋์ ์ฒ๋ฆฌํ๊ณ ์ด๊ฒ์ ์์ฒ ๋ช ์๊ฒ ์ค๋ช ํด์ผ ํฉ๋๋ค. ์ ๋์ฝ๋์ ์์ ๋์ผ ํ ์๋ ์์ต๋๋ค. ์ฝ๋์์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ using ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฉ์ด๋ฅผ ์ค์ด์ญ์์ค.
UnicodeCodePoint์ผ ํ์๋ ์์ผ๋ฉฐ ๋จ์ํ CodePoint์ผ ์๋ ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ๋ ํนํฉ๋๋ค. "CodePoint"๋ณด๋ค ๊ธด API ์ฉ์ด๊ฐ ๋ง์ด ์์ผ๋ฏ๋ก ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋๋ ๋๋ฌด ๊ธธ๋ค๋ฉด ์ฝ๊ฐ์ ์ฝ์ด๊ฐ ์๋ using ๋ฌธ์ ์ฌ์ฉํ์ธ์.
๋๋ ์ด๊ฒ์ด ์ค์ ๋ก ๋ง์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ์ง ์๊ฑฐ๋ ์ ์ฉํ ๊ฒ์์ ๋ ผ๋ฆฌ์ ๊ทผ๊ฑฐ๋ฅผ ๊ฐ์ง ์๋ ์ก๋คํ ์ธํฐ๋ทฐ ์ง๋ฌธ ์ค ํ๋๊ฐ ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ ์ด๋ "์ด์ ํ"๋ผ๋ ์์ ์ ๊ฒฝ์ฐ ๋๊ณผ ์์์์ ํ์๋ ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์์ง์ ๋จ์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ง๋ง ์ด์ ํ๋ ์ค์ ์ค๋ช ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค. ๋ชจ๋์๊ฒ ์น์ํ ๊ฐ๋ ์ ์ฆ์ ์ ๋ฌํฉ๋๋ค. ์ํ, ๋ง์น ๊ธด ์ฌํ์ ํ๊ณ ์ค์๊ธธ์ ์ง๋๊ฐ ๋์ ๊ฐ์ ์ด์ ํ์ ๋๋ค. ์ค์ ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์๊ฐํํ๋ ๋ฐ ๋์์ด ๋๊ณ ์ฆ์ ๊ด๋ฆฌ ์ธ์ด๊ฐ ๋ ์ ์๋ ๋ฉ์ง ์ค์ธ๊ณ ์์ ์ ๋๋ค. ์ฌ๋๋ค์ด ์ด ์ฃผ์ ์ ๋ํด ์ ์์ง ๋ชปํ๋ค๋ฉด ๋ฃฌ์ ๋ํด ์ด๋ฐ ์์ผ๋ก ์ด์ผ๊ธฐํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ์ด ์์ ์์ ๊ทธ๋ค์ ์ด๋ฏธ ๊ทธ๊ฒ์ด ์ฝ๋ ํฌ์ธํธ์ ๋ํ ์์์ ์ฉ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ ๋์ ๋จ์ด๋ ๊ธ๋ฆฌํ์ ๋๋ค. ์ด๋ฏธ ํ์ดํฌ๊ทธ๋ํผ์์ ์์ ๊ธฐํธ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌธ์ ๋ "Glyph"๊ฐ ์ ๋์ฝ๋๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ก ๋ ๋๋งํ ๋ ์ฌ์ฉ๋๋ ์ฉ์ด์ ๋๋ค(์ถ์ฒ: utf8everywhere.org).
"๋ฃฌ"์ ์ ๋์ฝ๋๋ ํธ๋์ง์คํฐ, ๋ง์ดํฌ๋ก์ํํธ, ์คํ ์์ค๊ฐ ์กด์ฌํ๊ธฐ ํจ์ฌ ์ด์ ๋ถํฐ ์ญ์ฌ๋ฅผ ํตํ์ด ์ฒ ๋ ์ด ๋๋ ๊ธฐ๊ฐ ๋์ ์ฌ์ฉ๋ ์ฉ์ด์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ถ๋ก ์ ๋ฃฌ๋ ์ง์ํ์ง ์์ต๋๋ค.
๋ด ์์ ์ "๊ธ๋ฆฌํ"๋ผ๋ ๋จ์ด๊ฐ ์ด๋ฏธ ํ ์คํธ ๋ ๋๋ง์ ๊ฐ๋ ์ค ํ๋๋ก ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ํน์ ๊ธ๊ผด์์ ํด๋น ๋ฌธ์์ ๊ทธ๋ํฝ ํํ์ ๋๋ค. ๋ฐ๋ผ์ ์บ๋ฆญํฐ๋ ๋ค์ํ ๊ธ๋ฆฌํ๋ก ํํ๋ ์ ์์ต๋๋ค.
...๋ 10,000๋ฏธํฐ ๋ทฐ์ @benaadams ์ ์ ๋ต๊ณผ ํจ๊ป ๐
์์งํ ๋งํด์ ์ฐ๋ฆฌ๋ ์ ๊ฒฉ์ธ์ ๋ฐ๋ผ ์ด์์ผ ํ ๊ฒ์ ๋๋ค. "์ผ๋ถ ์ฌ๋๋ค์ ํญ์ ํ๋ณตํ๊ฒ ํ ์ ์๊ณ ๋ชจ๋ ์ฌ๋๋ค์ ํ๋์ ํ๋ณตํ๊ฒ ํ ์ ์์ง๋ง ๋ชจ๋ ์ฌ๋๋ค์ ํญ์ ํ๋ณตํ๊ฒ ๋ง๋ค ์๋ ์์ต๋๋ค. ์๊ฐ." ์ด๊ฒ์ ๋งค์ฐ ์ ์์ ์ํฉ์ ๋๋ค.
์์ง?
Exit, pursued by a bear.
์ด API๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๋ ์ฌ๋์ผ๋ก์ ์ ๋ ์ฝ๋ ํฌ์ธํธ์ ๊ฐ๋ ฅํ๊ฒ ํ ํ๋ฅผ ๋์ง๋๋ค. ์ ๋์ฝ๋ ์ฉ์ด๋ ์ด๋ฏธ ์ถฉ๋ถํ ํผ๋์ค๋ฝ๊ณ ๋ถ์ผ์น๊ฐ ์ด๋ฏธ ๋ง์ต๋๋ค. ๋ชจ๋ ๊ณณ์์ "์ฝ๋ ํฌ์ธํธ"๋ผ๊ณ ๋งํ ์ ์๋ค๋ฉด ๋ด ์ถ์ด ํจ์ฌ ์ฌ์์ง ๊ฒ์ ๋๋ค.
๋๋ ์ง๊ธ ์นจ๋์ ๋์์๋ค. ์์ผ๋ก ๋์์๋ฉด ๋ฒฝ์ ๊ธฐ๋์ด ์๋ ํ์ดํธ๋ณด๋์ ๋ง์ฃผํ๊ฒ ๋๋ค. ๋ด๊ฐ C#์์ IDN์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๋์ ๋ช ๋ฌ ๋์ ๊ทธ ํ์ดํธ๋ณด๋๋ ๋ค์ํ ๋์์ ์ฐจํธ์ ๊ณ ํฅ์ด์์ต๋๋ค. ์ง์ฅ ๊น์ ๊ณณ์์ ๋ถ๋ฌ์จ ์ ๋ฌผ์ฒ๋ผ ์ทจ๊ธํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ค๋ช ํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ค๋ช ํ๋ ค๊ณ ์๋ํ๋ค๋ฉด, ๋๋ ํ ์ ์์์ ๊ฒ์ ๋๋ค.
์ ์ถ์ ํ๋ค๊ฒ ํ์ง ๋ง์์ฃผ์ธ์. ์ฝ๋ ํฌ์ธํธ๋ ์ฝ๋ ํฌ์ธํธ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ฃฌ ๋ฌธ์, ๋ฌธ์, ๋ฌธ์, ๋ฌธ์ ๋๋ ๊ธฐํธ๊ฐ ์๋๋๋ค. ์ธ๊ฐ์๊ฒ ์๋ฏธ ์๋ ๊ฒ์ ๋ํ๋ผ ํ์๋ ์์ต๋๋ค. ์ ์ด ์ฝ๋์ผ ์ ์์ต๋๋ค. "๋ฃฌ"์ด๋ผ๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์๊ฐ์ ๊ธฐํธ๋ฅผ ๋ํ๋ด์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์ฝ๋ ํฌ์ธํธ์ ๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ธ ์ฃผ์ฅ์ "๋ฃฌ"์ด ๋จ์ผ ์์์ ํํ์ ์๋ฏธํ๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ ์ข ์ข ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฝ๋ ํฌ์ธํธ ์์ ์์ ์๋ฅผ ์ธ์ด ๋ณด๋ฉด ๋ ๊ฐ์ ๋งค์ฐ ๋ค๋ฅธ ์ซ์๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๋์ผํ ์์ ์ํ์ค๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ผ๋ จ์ ์ฝ๋ ํฌ์ธํธ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
๋ ๋์ ๋จ์ด๋ ๊ธ๋ฆฌํ์ ๋๋ค. ์ด๋ฏธ ํ์ดํฌ๊ทธ๋ํผ์์ ์์ ๊ธฐํธ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๊ฒ ๋ ๋์๋ค. ๋จ์ผ ์ฝ๋ ํฌ์ธํธ๋ ์ฌ๋ฌ ๊ธ๋ฆฌํ๋ก ๋ํ๋ผ ์ ์๊ณ ๋จ์ผ ๊ธ๋ฆฌํ๋ ์ฌ๋ฌ ์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ ํํ ๋งคํ์ ์์คํ , ํ๋ก๊ทธ๋จ, ์์ฒด์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ด ๋ชจ๋ ๋จ์ด์๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ด ์ ์์ ๋งฅ๋ฝ์์ ์ฐจ์ด์ ์ด ์ค์ํ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ๋ค๋ฅธ ๊ณณ, ํนํ ์์ด ์ด์ธ์ ์ธ์ด์์ ์ค์ง์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ ์ผ์ด์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ธ์ด์์๋ ํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ๋ณด์ฌ์ฃผ๋ ์:
ร
๋ฅผ ๋๋ฌธ์๋ก ๋ณํํ๋ฉด SS
๊ฐ ๋ฉ๋๋ค.ss
๊ฐ ๋ฉ๋๋ค.๋ฌธ์ :
char.ToUpper('ร')
๋ ๋ฌด์์ ๋ฐํํด์ผ ํฉ๋๊น? (ํ๋์ ๋ฌธ์๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.)์ด๊ฒ์ ์ฉ์ด๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ํฉ์ ์ง์ ์ ์ธ ์๋ ์๋์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ์ง ์๋ ์ผ์ข ์ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค. ๊ฐ ์ฉ์ด์ ๊ณ ์ ํ๊ณ ์ผ๊ด๋ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ํ์์๊ฒ ์์ ์๋ฅผ ์ธ๋ ํจ์๋ฅผ ์์ฑํด ๋ฌ๋ผ๊ณ ์์ฒญํ๋ฉด ๊ทธ๋ค์ ์ ํํ ๋ฌด์์ ๊ณ์ฐํ๊ณ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง ์๊ณ ์์ต๋๋ค. ๋ด๊ฐ ๊ทธ๋ค์๊ฒ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ธ๋๋ก ์์ฒญํ๋ฉด, ๊ทธ๋ค์ ๋ฌด์์ ํด์ผ ํ๋์ง ์ ํํ ์๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ ์๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ธ์ด ๋ฐ ๊ธฐ์ ๊ณผ ๋ฌด๊ดํฉ๋๋ค.
JavaScript ๊ฐ๋ฐ์์๊ฒ ๋ฃฌ ์๋ฅผ ์ธ์ด ๋ฌ๋ผ๊ณ ํ๋ฉด ๋จธ๋ฆฌ๊ฐ ์ธ ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๊ฒ์ ๋๋ค.
์ํคํผ๋์๋ ๋งํ๋ค
์ ๋์ฝ๋๋ 0hex์์ 10FFFFhex ๋ฒ์์ 1,114,112 ์ฝ๋ ํฌ์ธํธ์ ์ฝ๋ ๊ณต๊ฐ์ ์ ์ํฉ๋๋ค.
์ฝ๋ํฌ์ธํธ๊ฐ ์ ์ ๋ช ์นญ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์ค๋ ๋๋ฅผ ์ฝ์์ง๋ง ์ฝ๋ ํฌ์ธํธ๊ฐ ์๋ชป๋ ์ด์ ์ ๋ํ ๊ฐ์ ์ธ์๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๋๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ์ฌ๊ธฐ์ ์ฌ์ฉํ๊ธฐ์ ์ฌ๋ฐ๋ฅธ ์ฉ์ด๊ฐ ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ต์ํ ์ ๋์ฝ๋ ํ์ค์ ๋ฐ๋ผ 10FFFF(http://unicode.org/glossary/#code_point) ์ด์์ ๊ฐ์ ํฌํจํ์ง ์์ต๋๋ค.
๊ทธ ๋ฌธ์ฅ์ด ์๋ชป๋ ๊ฒ์ ์๋๊น? "์ฝ๋ ๊ณต๊ฐ์ ๋ชจ๋ ๊ฐ"์ด๋ผ๊ณ ํ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์๋ฅผ ์๋ชป ์ดํดํ๋ ๋์์ ๋ชจ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ํ "๋ฃฌ"์ ์ ๋์ฝ๋์ ์๋ฌด ๊ด๋ จ์ด ์๋ ํ์ค ์ธ๊ณ์ ์๋ฏธ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ ์ผ์์ "๋ฃฌ"์ด๋ผ๋ ๋จ์ด๋ ๋์น์ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฃฌ์ ๋์น๊ฐ ์ธ๊ธํ๊ธฐ๋ฅผ ์ข์ํ๋ "๊ฒ๋ฅด๋ง" ์ญ์ฌ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ "๋ฃฌ"์ด ํผ๋์ค๋ฌ์ด ์ด๋ฆ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ ์ฌ๋์ด "๋ฃฌ"์ ์ ๋ง ์ข์ ํ๊ฑฐ๋ ์ ํ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ฃผ์ฅ์ด ์์ต๋๊น? ์ง๊ด์ ์ผ๋ก, ๊ทธ๊ฒ์ ์ ๋ง ๋์ ์ด๋ฆ์ ๋๋ค.
๊ทธ ๋ฌธ์ฅ์ด ์๋ชป๋ ๊ฒ์ ์๋๊น? "์ฝ๋ ๊ณต๊ฐ์ ๋ชจ๋ ๊ฐ"์ด๋ผ๊ณ ํ์๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์๋ฅผ ์๋ชป ์ดํดํ๋ ๋์์ ๋ชจ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ ๋ฌธ์ฅ์ด ๋ง์ต๋๋ค. ์ฝ๋ ๊ณต๊ฐ์ U+0000 ~ U+10FFFF์ ๋๋ค. ์ ๋์ฝ๋๋ ์ด๋ก ์ ์ผ๋ก ์ธ์ ๊ฐ๋ ๊ทธ ์ด์์ผ๋ก ํ์ฅ๋ ์ ์์ง๋ง UTF-8๊ณผ UTF-16์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ์๋ก์ด ์ธ์ฝ๋ฉ์ด ํ์ํฉ๋๋ค.
ํธ์ง: ์ฌ์ค, UTF-16 ํ์์ ๋ํด ์ ๋ฅผ ์ธ์ฉํ์ง ๋ง์ญ์์ค. ํ์ง๋ง UTF-8์ด ํ์๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. UTF-8์ ํ์คํ 0xFFFFFF(2^24 -1)๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
ํธ์ง 2: ๋ช ํํ ํ๊ธฐ ์ํด ์ ๋์ฝ๋๋ ์ฝ๋ ํฌ์ธํธ๊ฐ U+10FFFF๋ฅผ ์ด๊ณผํ ์ ์๋ค๊ณ ๋ช ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ํ์ฌ 0x110000๊ฐ์ ์ฝ๋ ํฌ์ธํธ๊ฐ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ๋๋ถ๋ถ์ ์ฝ๋ ํฌ์ธํธ๋ ํ ๋น๋์ง ์์์ต๋๋ค.
@์ ๋ฅ์ @GSPP
ํ์ฌ ๋ง์คํฐ์ ์ฒดํฌ์ธ๋ ์ด ์ ํ( System.Text.Rune
)์ "์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ"์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋งคํ๋ฉ๋๋ค( ์ฉ์ด์ง ์ฐธ์กฐ ). -1
, 0xD800
๋๋ 0x110000
๊ฐ์์ ๊ตฌ์ฑํ๋ ค๊ณ ํ๋ฉด ์ ํ์ ctor๊ฐ ์์ธ๋ฅผ throwํฉ๋๋ค. ์ด๋ ์ ๋์ฝ๋ ์ฌ์์ ๋ฐ๋ฅธ ์ค์นผ๋ผ ๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. Rune
๋งค๊ฐ๋ณ์๋ฅผ ๋ฉ์๋์ ๋ํ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ์ ํ ์์คํ
์ ์ด๋ฏธ ์ ํจํ ์ค์นผ๋ผ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋์์์ ํ์ธํ์ต๋๋ค.
๋ค์: ๋์๋ฌธ์ ๋ณํ, .NET Framework์ ๋ชจ๋ ๋์๋ฌธ์ ๋ณํ API๋ _๋ฌ๋ฆฌ ์ธ๊ธ๋์ง ์๋ ํ_ ๋จ์ ๋์๋ฌธ์ ์ ๊ธฐ๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ๋จ์ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ ๋ฐ๋ผ ๋ชจ๋ ์ ๋ ฅ ์ค์นผ๋ผ ๊ฐ์ ๋ํด ์ถ๋ ฅ ์๋ฌธ์, ๋๋ฌธ์ ๋ฐ ์ ๋ชฉ ํ์๋ ๊ฐ๊ฐ ์ ํํ ํ๋์ ์ค์นผ๋ผ ๊ฐ์ด ๋๋๋ก ๋ณด์ฅ๋ฉ๋๋ค. (์ซ์ 0-9 ๋๋ ๊ตฌ๋์ ๊ธฐํธ์ ๊ฐ์ ์ผ๋ถ ์ ๋ ฅ์ ๋์๋ฌธ์ ๋ณํ ๋งต์ ํญ๋ชฉ์ด ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ _ToUpper_์ ๊ฐ์ ์ฐ์ฐ์ ๋จ์ํ ์ ๋ ฅ ์ค์นผ๋ผ ๊ฐ์ ๋ฐํํฉ๋๋ค.) ๋ํ ๊ฐ๋จํ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ ๋ฐ๋ผ ์ ๋ ฅ์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ค๊ตญ์ด ํ๋ฉด(BMP)์์ ์ถ๋ ฅ๋ BMP์ ์์ด์ผ ํฉ๋๋ค. ์ ๋ ฅ์ด ๋ณด์กฐ ํ๋ฉด์ ์์ผ๋ฉด ์ถ๋ ฅ๋ ๋ณด์กฐ ํ๋ฉด์ ์์ด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ฒซ์งธ, Rune.ToUpper
๋ฐ ์น๊ตฌ๋ ํญ์ ๋จ์ผ _Rune_(์ค์นผ๋ผ) ๊ฐ์ ๋ฐํํฉ๋๋ค. ๋์งธ, String.ToUpper
๋ฐ ์น๊ตฌ๋ ํญ์ ์
๋ ฅ๊ณผ ์ ํํ ๋์ผํ ๊ธธ์ด์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค. ์ด๋ ๋์๋ฌธ์ ๋ณํ ์์
ํ์ 'ร'(์ํ eszett)๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด์ด ์ฌ์ฉ๋๋ ๋ฌธํ๊ถ์ ๋ฐ๋ผ 'ร'(๋ณ๊ฒฝ ์์) ๋๋ 'แบ'(majuscule eszett)์ ํฌํจํ๊ฒ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ "SS"๋ฅผ ํฌํจํ์ง _์์ต๋๋ค_. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด ๊ธธ์ด๊ฐ ๋ณ๊ฒฝ๋๊ณ ๊ณต๊ฐ์ ์ผ๋ก ๋
ธ์ถ๋ ๊ฑฐ์ ๋ชจ๋ .NET ๋์๋ฌธ์ ๋ณํ API๊ฐ ๊ฐ๋จํ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์
์งธ, Utf8String.ToUpper
๋ฐ ์น๊ตฌ(์์ง ์ฒดํฌ์ธํ์ง ์์)๋ _Length_ ์์ฑ์ด ์
๋ ฅ ๊ฐ์ _Length_ ์์ฑ๊ณผ ์ผ์นํ๋ ๊ฐ์ ๋ฐํํ์ง _์์ต๋๋ค_. (๋ฌธ์์ด์ UTF-16 ์ฝ๋ ๋จ์ ์๋ ๊ฐ๋จํ ๋์๋ฌธ์ ์ ๊ธฐ ํ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ฌธ์์ด์ UTF-8 ์ฝ๋ ๋จ์ ์๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ์ด๋ BMP ๊ฐ์ด UTF-16 ๋ฐ UTF-๋ก ์ธ์ฝ๋ฉ๋๋ ๋ฐฉ์ ๋๋ฌธ์
๋๋ค. 8.)
๋ด๋ถ์ ์ผ๋ก ๋จ์ํ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ด ์๋ ๋ณต์กํ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ ์ฌ์ฉํ๋ ์ผ๋ถ .NET API๊ฐ ์์ต๋๋ค. String.Equals
, String.IndexOf
, String.Contains
๋ฐ ์ ์ฌํ ์์
์ ๋ฌธํ์ ๋ฐ๋ผ ๋ณต์กํ ๋์๋ฌธ์ ์ ๊ธฐ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฌธํ๊ถ์ด _de-DE_๋ก ์ค์ ๋ ๊ฒฝ์ฐ _CurrentCultureIgnoreCase_๋ฅผ ์ ๋ฌํ๋ฉด ํ ๋ฌธ์ ๋ฌธ์์ด "ร"์ ๋ ๋ฌธ์ ๋ฌธ์์ด "SS"๊ฐ ๋์ผํ ๊ฒ์ผ๋ก ๋น๊ต๋ฉ๋๋ค.
@GrabYourPitchforks ๋๋ ์ฃผ๋ก ์ด๋ฆ ์ ํ์ ๋ฐ๋ํฉ๋๋ค. ์ฌ๋ก ์ ๊ธฐ ์์ ๋ ์์ ํ ์ ๋์ฝ๋(๋ฐ ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ)๊ฐ ์ผ๋ง๋ ๋ณต์กํ์ง๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. normalization ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ ํ ๊ฐ๋จํ ์์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค. ๋ด ์ฌ์ฉ ์ฌ๋ก์์๋ ์ด์จ๋ ๋ชจ๋ ๊ฒ์ NFKD๋ก ๋ณํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ ๋ฌธ์ฅ์ด ๋ง์ต๋๋ค. ์ฝ๋ ๊ณต๊ฐ์ U+0000 ~ U+10FFFF์ ๋๋ค. ์ ๋์ฝ๋๋ ์ด๋ก ์ ์ผ๋ก ์ธ์ ๊ฐ๋ ๊ทธ ์ด์์ผ๋ก ํ์ฅ๋ ์ ์์ง๋ง UTF-8๊ณผ UTF-16์ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ์๋ก์ด ์ธ์ฝ๋ฉ์ด ํ์ํฉ๋๋ค.
๊ฐ๋จํ ๋งํด์(๋๋ ์ฌ๋๋ค์ด ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ) ์ด๋ก ์ ์ผ๋ก UTF-8 ์๊ณ ๋ฆฌ์ฆ์ ์ต๋ 42๋นํธ(์ ๋์ฌ ๋ฐ์ดํธ 0xFF ๋ฐ 6๋นํธ ํ์ด๋ก๋์ 7๋ฐ์ดํธ)์์ ์๋ํ๋ฉฐ ์๋ ์ฒซ ๋ฒ์งธ ์ฌ์ ์ ์ ์ฒด 31๋นํธ๋ฅผ ๋ค๋ฃจ์์ต๋๋ค. ๋ฒ์ฉ ๋ฌธ์ ์งํฉ(UCS4)์ ์ด์ ๋ฒ์ ์
UTF-16์ ๊ฒฝ์ฐ ์ํฉ์ด ๋ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ 32๋นํธ ์ด์์ ๋ํด "Escapes"๋ก ์์ ํ๋ฉด์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์์ฝํ ์ ์์ต๋๋ค. ๋นํ๊ธฐ 3~13์ ํ์ฌ ์ ์๋์ง ์์์ผ๋ฏ๋ก "๋ฎ์ ๋๋ฆฌ ๋นํ๊ธฐ"์ "๋์ ๋๋ฆฌ ๋นํ๊ธฐ"๋ก ๋ ๊ฐ๋ฅผ ์์ฝํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ 32๋นํธ ์ฝ๋ํฌ์ธํธ๋ 2๊ฐ์ 16๋นํธ ๊ฐ(๊ฐ ํ๋ฉด์ ํ๋์ฉ)์ผ๋ก ๋ถํ ๋๊ณ ๊ฐ ๊ฐ์ 32๋นํธ ์ฝ๋ํฌ์ธํธ๋ฅผ ์ธ์ฝ๋ฉํ๊ธฐ ์ํด ๊ฐ๊ฐ 16๋นํธ์ 4๊ฐ ์ฝ๋ ๋จ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ์ฌ 2๊ฐ์ "ํด๋์" ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
Btw, AFAICS, ์ ๋์ฝ๋ ์ปจ์์์์ U+10FFFF ์ด์์ ์ฝ๋ํฌ์ธํธ๋ฅผ ํ ๋นํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ณต๊ฐ์ ์ผ๋ก ๋ฐํ์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ ๊ทธ๋ฐ ์ผ์ด ์ค์ ๋ก ์ผ์ด๋๊ธฐ ์ ์ ์ ๊ฐ ์ค๋ ์ํดํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. :๋์ง:
ํ์ฌ ๋ง์คํฐ์ ์ฒดํฌ์ธ๋ ์ด ์ ํ(
System.Text.Rune
)์ "์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ"์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋งคํ๋ฉ๋๋ค.
@GrabYourPitchforks ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ๊ตฌ์กฐ์ฒด๊ฐ ์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ํ๋ด์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๊ทธ ์ด๋ฆ์ ์ค์ ๋ก ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค.
UnicodeScalar
์ด๋ฆ์ด ๋๋ฌด ์ ๋งคํ ๊ฒ ๊ฐ์์...
@GrabYourPitchforks , ์ด ๋ฌธ์ ์ ๋ํด ๋ฌด์์ ํด์ผ ํฉ๋๊น?
@stephentoub 3.0์ ๊ธฐ๋ณธ Rune
์ ํ์ ๋ํด ๊ณํ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์์ง๋ง @migueldeicaza ๋ ์์ ํด๋ฌ์คํฐ์ ๊ฐ์ ๊ฒ์ ํฌํจํ์ฌ ์ ํ์ ๋ฒ์๋ฅผ ํ์ฅํ๋ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. (์ธ๋ฐ์ค์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ TextElementEnumerator
์
๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ค๋๋ ์ ํ์
๋๋ค.) ์ด๋ฌํ ์์ด๋์ด ์ค ์ผ๋ถ๋ ์ด ์ค๋ ๋์์ ๋ฌถ์์ง๋ง ์์ง ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์ต๋๋ค.
์ปค๋ฎค๋ํฐ๊ฐ ์๋๋ฆฌ์ค์ ๋ํด ๋ ๋ ผ์ํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ์ด์ด๋ ์ ์๊ณ , ํน์ ์ ์์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ๋๋ค์๊ฒ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด๋๋ก ์ง์ํ ์ ์์ต๋๋ค. TBH ๋๋ ๊ฐํ ์ ํธ๋๊ฐ ์์ต๋๋ค.
๊ฐ์ฌ ํด์. Rune์ด ์ด๋ฏธ ๋์ ๋์๊ณ ์ฌ๊ธฐ์ ์ค๋ช ๋ API(๋๋ ๊ทธ ๊ทผ์ฌ๊ฐ)๊ฐ ์ด๋ฏธ ๋ ธ์ถ๋์ด ์์ผ๋ฏ๋ก ์ด ์์ ์ ์ข ๋ฃํ๊ฒ ์ต๋๋ค. ์ถ๊ฐ ์ง์์ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ์ด ์์ ์์ ๋ณธ์ง์ ์ผ๋ก ์์ ํ๋ ๊ฒ์ ๋๊น? ์์งํ ๋งํด์ ์ด ๋๋ ค์ด ์ด๋ฆ์ ํ๋ฅญํ๊ณ ์ ํํ ์ถ์ฒ์์ ์ป์ ์ ์๋ ์ ๋์ฝ๋ ์ ๋ณด์ ์ผ์นํ์ง ์์ผ๋ฉฐ ์ธ์๋์ง ์๋ ๋ฌธ์์ ๋์กฐ์ ์ผ๋ก ์ํ ๋ฌธ์๋ฅผ ์์ํ๋ ๋ถํํ ๋์์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋ฒํ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ๋์ฝ๋์ ๋ํด ์ด๋ฏธ ๋๋ ค์ด ์ดํด๋ฅผ ํ๋ ๊ฒ์ ์ ํ์ํต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ด ์์ ๊น์ง ํตํฉ๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง Rune
๋ถ๋ถ๊ณผ ์ด๋ฆ์ ๋ํ ์ผ๋ถ ์ฌ๋๋ค์ ์๊ฒฌ ๋ถ์ผ์น์ ๋ํด ์ฐจ์ํ๊ณ ์ถ์ต๋๋ค.
๋๋ ํ๋ 9์์ Rune
๋ฅผ ์ฒ์ ๋ง๋ฌ๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ฒ๋ผ Go์์ ๊ทธ๊ฒ์ ๋ณด์์ต๋๋ค. msdocs๊ฐ Rune
๋ฅผ ๋์ดํ๊ธฐ ์์ํ์ ๋ ๋๋ ์ฝ๊ธฐ ์ ์ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ ํํ ์๊ณ ์์์ต๋๋ค.
Plan 9์ Go์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์๋ Rune
๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ UTF-8์ ๋ด๋นํ๋ ๊ฐ์ธ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ด๋ฌํ ์ฐ๋ ค์ ๋ํด ์ด๋ฏธ ์๊ฐํ๊ณ ์ฌ์ ํ Rune
๊ฐ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฃฌ ๋ฌธ์๋ ์ผ๋ถ ์ ํต ์ฃผ์์๋ฅผ ์ ์ธํ๊ณ ๋ ์ด์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ์ฐ๊ธฐ ์์คํ
์ด ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ Rune
๋ ๋ณธ์ง์ ์ผ๋ก ์ฌ๊ธฐ์์ ์์๋ฅผ ์๋ฏธํ๋ ๊ฒ์ฒ๋ผ ํด๋น ์์คํ
์ ์์๋ฅผ ์๋ฏธํฉ๋๋ค(์ ์ด ๋ฌธ์์ ๊ฐ์ ๊ฒฝ์ฐ ์ ์ธ.
๋ค์ด๋ฐ์ ์ฝ๊ฐ์ ์ค๋ฅ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Runic์ ๋๋ฌด ์ค๋๋ ์ฐ๊ธฐ ์์คํ
์
๋๋ค. ํ๋ฒํ ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ทธ๊ฒ์ ํผ๋ํ ์ง๋ ์์ฌ์ค๋ฝ์ต๋๋ค. ์ ์ ํ ์ ๋์ฝ๋ "๋ฌธ์"์ ๋ํ Rune
๋ผ๋ ์ฌ์ค์์ ํ์ค์ด ์ด๋ฏธ ์์ญ ๋
์ ์ ์์์ต๋๋ค.
@์ํ ๋ฏธ
๋ณธ์ง์ ์ผ๋ก ์ฌ๊ธฐ์์ ์์๋ฅผ ์๋ฏธํ๋ ๊ฒ์ฒ๋ผ (์ ์ด ๋ฌธ์์ ๊ฐ์ ๊ฒฝ์ฐ ์ ์ธ.
์ด๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ์ ๋์ฝ๋์๋ ์ฌ๋ฌ ์์(์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ ๋ฐ ๋ฐ์ ๊ตฌ๋ณ ๋ถํธ ์กฐํฉ)๋ฅผ ๋ํ๋ด๋ ์ฌ์ ๊ตฌ์ฑ๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ์์ฒญ๋๊ฒ ๋ง์ด ํฌํจ๋์ด ์์ผ๋ฉฐ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ค์ด ๋ฐ ์คํ์ธ์ด์ ๊ฐ์ ์ธ์ด๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ์ด๋ฌํ ์ธ์ด์ ๊ฑฐ์ ๋ชจ๋ ์ปดํจํฐํ๋ ํ ์คํธ๋ ์ด๋ฌํ ์ฝ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํฌ์ธํธ๋ค.
๋ฐ๋๋ก ๋จ์ผ ์ฝ๋ ํฌ์ธํธ๊ฐ ํ๋์ ์์๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ์ ์ธ๋ ์ธ์ด์์ ํ ์คํธ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์์ ์ธ _์์ ํด๋ฌ์คํฐ_๋ก ๊ฒฐํฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค. ๋ฐ๋ผ์ ํ์ดํ ํค๋ก ์ด๋ํ ๋ ์ฌ์ฉ์๊ฐ ์ธ์ํ๋ ๋จ์ผ ๋ฌธ์๋ ์ข ์ข ์ฌ๋ฌ ์ฝ๋ ํฌ์ธํธ์ ์์ฐจ์ ์ผ๋ก ํด๋นํฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ๋ ํฌ์ธํธ์ ์์ ๋๋ ์์ ํด๋ฌ์คํฐ ์ฌ์ด์๋ ์ฌ์ด ๋์์ด ์์ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด ์์ ์์ ๋ฌธ์๋ฅผ ์ด์ํ๊ณ ์๋ฑํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๋ฐ ์ต์ํ๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ "๋ฌธ์"๋ผ๋ ์๋ง๋ ๋ ๋์ ์ด๋ฆ์ด ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ฉด "๋ฃฌ"์ ์ฌ์ฉ์๊ฐ ์ธ์ํ๋ ๋ฌธ์ ๊ฒฝ๊ณ๋ฅผ ํ์ ํ๋ ๋ฌธ์ ๊ฐ ํ๋ก๊ทธ๋๋จธ์๊ฒ ํด๊ฒฐ๋์๋ค๋ ์ธ์์ ์ค๋๋ค. ์ค์ ๋ก ์์์ ๋ ์ด๋ฏธ.
msdocs๊ฐ Rune์ ๋์ดํ๊ธฐ ์์ํ์ ๋ ๋๋ ์ฝ๊ธฐ ์ ์ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์ ํํ ์๊ณ ์์์ต๋๋ค.
rune์ด๋ผ๋ ์ด๋ฆ์ด ์์๋ฅผ ์ ์ค๋ช ํ๋ค๊ณ ์๊ฐํ๋ค๋ ์ฌ์ค์ ๋ด๊ฐ ์ฌ๊ธฐ์ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ์ ๋ํ ์์ฃผ ์ข์ ์ฆ๊ฑฐ์ ๋๋ค. "rune"์ด๋ผ๋ ์ด๋ฆ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ทธ๋ฌํ ๋์์ด ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ ์ฝ๊ฒ ํจ์ผ๋ก์จ ์๋ชป๋ ๋ณด์ ๊ฐ๊ฐ์ ์ค๋๋ค.
Plan 9์ Go์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ์๋
Rune
๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ UTF-8์ ๋ด๋นํ๋ ๊ฐ์ธ์ด ์์ต๋๋ค.
๋ด๊ฐ Ken Thompson๊ณผ Rob Pike๋ฅผ ์กด๊ฒฝํ๋ ๋งํผ ์ฌ๊ธฐ์์์ ๊ทธ๋ค์ ์์ ์ ๋ณธ์ง์ ์ผ๋ก ์ผ๋ จ์ ๊ฐ๋ณ ๊ธธ์ด ์ ์๋ฅผ ์ธ์ฝ๋ฉํ๊ธฐ ์ํ ๋งค์ฐ ์๋ฆฌํ ๊ณํ์ ๊ณ ์ํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ค์ ์ ๋์ฝ๋ ์ ์ฒด์ ๋ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋ฉฐ ๋๋ ์ด ๋ฌธ์ ์ ๋ํด ๊ทธ๋ค์๊ฒ ๋งค์ฐ ๊ฐ๋ ฅํ๊ฒ ๋์ํ์ง ์์ต๋๋ค. ์ ๋ ์ ๋์ฝ๋ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋ผ๋ ์ ์ ์ธ์ ํ์ง๋ง, ๊ถ์์ ๋ํ ํธ์๋ ฅ์ด ๋ณด์ด๋ ๊ฒ๋งํผ ๊ฐ๋ ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ ํ ์ ๋์ฝ๋ "๋ฌธ์"์ ๋ํ ๋ฃฌ์ ์ฌ์ค์ ํ์ค์ด ์์ญ ๋ ์ด ๋์์ต๋๋ค.
"ํ์ค"์ด๋ผ๊ณ ํฉ๋๊น? ๋๋ถ๋ถ ์ด ๋ ๊ฐ์ง๊ฐ ์ด๋ฆ์ ๋ฐ์ด๋ถ์๊ณ Nim๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฌ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ Go์์ ์ด ์ด๋ฆ์ ์ฑํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ์ ํ, ํ์ดํ ํค ์ด๋, ์์ ๋๋ ์์ ํด๋ฌ์คํฐ์ ์๋ฏธ์์ ์ฝ๋ ํฌ์ธํธ๊ฐ ๋จ์ผ "์ ์ ํ ์ ๋์ฝ๋ ๋ฌธ์"๋ฅผ ๋ํ๋ด์ง ์๋๋ค๋ ์ ์ ๋ค์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
...๋ณธ์ง์ ์ผ๋ก ์ฌ๊ธฐ์์ ์์๋ฅผ ์๋ฏธํฉ๋๋ค...
์, ์ ํํ์ง๋ ์์ง๋ง ๋๋ต์ ์ผ๋ก ์ถฉ๋ถํ ๊ฐ๊น์ต๋๋ค. ์ ์ด๋ ์ธ์ดํ์์ ์ ์๋๋ ๋ฌธ์์๋ ์ฐ๊ธฐ ์ฒด๊ณ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์๋ฅผ ํํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฒ ์๋ฒ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ด๊ฒ๋ค์ 1:1์ด ์๋๋๋ค. ์์ ๋ฐ ๋ก๊ณ ์์ ์์ ๋จ์ผ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์์-๋ชจ์ ์์ผ๋ก ์ฌ๋ฌ ์์๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ๋ฐ๋๋ก ์ํ๋ฒณ์์ผ๋ก ์ธ์ด์๋ ํน์ ๋จ์ด์ ๋ฐ๋ผ ์์ด์ "th"๊ฐ ๊ณ ๋ eth์ thorn์ ๋ด๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋จ์ผ ์์๋ฅผ ๋ํ๋ด๋ ์ฌ๋ฌ ์์์ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ 'รก'์ ๊ฐ์ ๋ฌธ์๊ฐ ๊ณ ์ ํ ๋ฌธ์์ธ์ง ๋๋ ์ ์ผํธ๊ฐ ์๋ 'a'์ธ์ง์ ๋ํด ์ธ์ด ๊ฐ์ ์ผ์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ฒ ๋ ์ด ์ง๋ ์ธ์ด์ ์ผ๊ด์ฑ์กฐ์ฐจ ํ๋ฆฝํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ์์ ์๋ฒฝํ๊ฒ ์ผ๊ด๋ ์ถ๊ฐ๋ฅผํ์ง ์์ ๊ฒ์ ๋๋ค. ์ฆ, ์ธ์ฝ๋ฉ์ ๋๋ค.
๋น์ ์ด ๋งค์ฐ ์๊ฒฉํ ์๋ฏธ๋ก ์ ์ฃผ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ UNICODE๊ฐ "์์ ํด๋ฌ์คํฐ"๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ์ธ์ดํ์์ ์ข ์ข ๋จ์ผ ์์์ ๋ถ๊ณผํฉ๋๋ค. ์ด๊ฒ์ ์๋ชป๋ ์ ๋์ฝ๋์ ๋๊น? ์๋์. ์ด๊ฒ์ UNICODE์์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ค๋ ์๋ฏธ์ ๋๊น? ์ด์ ์์ด? ์ปจํ ์คํธ ๋๋ฌธ์ ๋๋ค. ํ๋์๋ ๊ณ ์ ํ ์ฉ์ด๊ฐ ์์ผ๋ฉฐ ๋จ์ผ ํ๋์ ์ตํฉ์ด ์๋ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋๋ฌด ํฐ ๊ฑฐ๋๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. Msdocs๋ ์์ฝ์ Rune
๊ฐ ๋ฌด์์ธ์ง ๋ช
ํํฉ๋๋ค. ์ฌ๋๋ค์ด ๋ฌธ์๋ฅผ ์ฝ์ง ์๋๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ๋ค ์์ ์ ๋ฌธ์ ์
๋๋ค. ์ฌ๋๋ค์ 'Stream'์ ๊ฒฉ๋ ฌํ๊ฒ ๋ฐ์ํ์ง ์๊ณ "์ค, ํ์ง๋ง ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์์ ๊ฐ์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์"์ ๊ฐ์ ๋ง๋ ์๋๋ ์๋ฆฌ๋ฅผ ํ์ง ์์ต๋๋ค. ์๋์.
@Serentty @Entomy ๋ ์ฌ๋ ๋ชจ๋ ์ค์ ์ ๋์ฝ๋ ๊ฐ๋
"ํ์ฅ๋ ์์ ํด๋ฌ์คํฐ"๋ฅผ ๋
ธ์ถํ๋ StringInfo
ํด๋์ค ์ ๊ด์ฌ์ด ์์ ์๋ ์์ต๋๋ค. StringInfo
์ ํ์ ์๋นํ ์ค๋๋์๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งค์ฐ ์ค๋๋ ๋ฒ์ ์ ์ ๋์ฝ๋ ํ์ค์ ๊ตฌํํ์ง๋ง UAX #29, Sec.
์, ์ ํํ์ง๋ ์์ง๋ง ๋๋ต์ ์ผ๋ก ์ถฉ๋ถํ ๊ฐ๊น์ต๋๋ค.
๋๋ ํฉ์ฑ๋ ํํ ๋ ๋ถํด๋ ํํ์ ๋ฌธ์ ๊ฐ ์ด๊ฒ์ ์ฌ์ค์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ปดํจํ ๊ด๋ จ ์ ์์ ๋ฌ๋ฆฌ ์ฌ๊ธฐ์์ ๋ฌธ์์์ ์ธ์ด์ ์ ์์ ๋ฐ๋ผ ๊ฐ๋ค๋ฉด ํ๊ณผ ํ์ ์ ํํ ๊ฐ์ ์์ ์ํ์ค์ ๋๋ค(์ธ ๊ฐ์ ํ๊ธ ์๋ชจ๋ ์์ _han_์ ์ธ๊ทธ๋จผํธ HAN์ผ๋ก ๋ํ๋). ๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ๋ ํ๋์ ์ฝ๋ ํฌ์ธํธ์ธ ๋ฐ๋ฉด ๋ ๋ฒ์งธ๋ 3๊ฐ์ ์ํ์ค์ ๋๋ค.
ํ๋์๋ ๊ณ ์ ํ ์ฉ์ด๊ฐ ์์ผ๋ฉฐ ๋จ์ผ ํ๋์ ์ตํฉ์ด ์๋ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค. ์ ๋์ฝ๋๋ ์์ฒด ์ฉ์ด๊ฐ ์๋ ์ ๋ง ๋ณต์กํ ์์คํ ์ ๋๋ค. ๊ทธ๋์ ์ ํํ ์ ๋ ฌ๋์ง ์์ ๋ ์ผ์ข ์ ๋ฐ์ฏค ๊ตฌ์ด "์ง๊ด์ ์ธ" ์ฉ์ด๋ฅผ ๊ฐ์ ๋ก ์ ์ฉํ๋ ค๊ณ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฝ๋ ํฌ์ธํธ๋ ์ฝ๋ ํฌ์ธํธ์ ๋๋ค. ์ธ์ด์ ์ ์ฌ์ฑ์ด ์์ผ๋ฉฐ 75%์ ์ ํ๋๋ง ์ ์งํ๋ฉด์ ์ง๊ด์ ์ผ๋ก ํ๋ ค๊ณ ํ๋ ๊ฒ์ C#์ด ์ฌ์ ํ ๋ณต๊ตฌํ๋ ค๊ณ ์๋ํ๋ ๋์ผํ ์ข ๋ฅ์ ์ฌ๋์ ๋ํ ๋ ์ํผ์ ๋๋ค.
๋น์ ์ด ๋งค์ฐ ์๊ฒฉํ ์๋ฏธ๋ก ์ ์ฃผ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ UNICODE๊ฐ "์์ ํด๋ฌ์คํฐ"๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ์ธ์ดํ์์ ์ข ์ข ๋จ์ผ ์์์ ๋ถ๊ณผํฉ๋๋ค.
ํ์ค์์ ํด๋ฌ์คํฐ๋ ๋จ์ผ ์์๋ก๋ง ๊ตฌ์ฑ๋๋๋ก ํ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. _cluster_๋ ํ ์คํธ ์ ํ ๋ฐ ์ปค์ ์ด๋์ ๋จ์์ ๋๋ค.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋๋ฌด ํฐ ๊ฑฐ๋๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. Msdocs๋ ์์ฝ์์ Rune์ด ๋ฌด์์ธ์ง ๋ช ํํฉ๋๋ค. ์ฌ๋๋ค์ด ๋ฌธ์๋ฅผ ์ฝ์ง ์๋๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ๋ค ์์ ์ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ ์๋ชป๋ ๋์์ธ ๊ฒฐ์ ์ ๋ฐฉ์ดํ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ๋์ค๋ "ํ๋ก๊ทธ๋๋จธ๋ ๋ ๋๋ํด์ผ ํ๋ค"๋ ์ฃผ์ฅ์
๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ด์จ๋ ๋ฃฌ์ด ์ ๋์ฝ๋ ์ฝ๋ ํฌ์ธํธ๋ผ๋ ๊ฒ์ ๋ฐฐ์์ผ ํ๋ ๊ฒฝ์ฐ ์ฒ์์ ๋ "์ง๊ด์ ์ธ" ์ด๋ฆ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์์ ์ด ๋ฌด์์
๋๊น? ์ฌ๊ธฐ์ ์ฃผ์ฅ์ "์ฝ๋ ํฌ์ธํธ"๊ฐ ํผ๋์ค๋ฝ๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ์ง๊ด์ ์ธ ์ด๋ฆ์ ์ ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด์ง๋ง, ์ด๋ฆ์ด ์คํด์ ์์ง๊ฐ ์๋ค๋ ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด์จ๋ ์ฝ๋ ํฌ์ธํธ๊ฐ ๋ฌด์์ธ์ง ์์์ผ ํ๋ค๋ ์ฃผ์ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ์์. ๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ CodePoint
์ ํ์ ํธ์ถํ๊ณ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ์ฝ๊ฒ ์ฐพ์๋ณด๊ณ ๋ฐฐ์ธ ์ ์๋๋ก ํ์ง ์๊ฒ ์ต๋๊น? ์ด๊ฒ์ .NET ๋ฌธ์๊ฐ ์ฒ์์ ์ ๋์ฝ๋์ ๊ด๋ จํ์ฌ ๋งค์ฐ ๋์ฐํ๋ค๋ ๋ฌธ์ ๋ฅผ ์ ์ณ๋๊ณ , "16๋นํธ ์ ๋์ฝ๋ ๋ฌธ์"์ ์ธ๊ณ์์ ๋๋ฆฌ ์์ ์ฌํ ๊ณ ๋ ค ์ฌํญ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
์ด๊ฒ์ ์๋ชป๋ ๋์์ธ ๊ฒฐ์ ์ ๋ฐฉ์ดํ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ๋์ค๋ "ํ๋ก๊ทธ๋๋จธ๋ ๋ ๋๋ํด์ผ ํ๋ค"๋ ์ฃผ์ฅ์ ๋๋ค.
๋๋ ์ด๊ฒ์ ๋งํ ์ ์ด ์๋ค.
์ฌ๊ธฐ์ ์ฃผ์ฅ์ "์ฝ๋ ํฌ์ธํธ"๊ฐ ํผ๋์ค๋ฝ๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ ์ด ๋ง์ ํ ์ ์ด ์๋ค.
์ฌ๋๋ค์ 'Stream'์ ๊ฒฉ๋ ฌํ๊ฒ ๋ฐ์ํ์ง ์๊ณ "์ค, ํ์ง๋ง ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์์ ๊ฐ์ด๋ผ๊ณ ์๊ฐํ๋ค๋ฉด ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์"์ ๊ฐ์ ๋ง๋ ์๋๋ ์๋ฆฌ๋ฅผ ํ์ง ์์ต๋๋ค. ์๋์.
๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ Rune
๊ฐ ํนํ ๋ฃฌ ๋ฌธ์๋ผ๊ณ ์๊ฐํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ๋๋ํ๋ค๊ณ ๋งํ๋ ๊ฒ์
๋๋ค. ๋ง์น ๊ทธ๋ค์ด Stream
๊ฐ ์์ ๊ฐ์ด ์๋๋ผ๋ ๊ฒ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์
๋๋ค.
์ด๊ฒ์ ๋ฐ๋ณตํ์
๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๊ฒ์ ์์๋ผ ๋งํผ ์ถฉ๋ถํ ๋๋ํ๋ค๊ณ ๋งํ๊ณ ์๋ค. ๋น์ ์ ๋ด ์ ์ ๋จ์ด๋ฅผ ๋ฃ์ด.
๋๋ ๊ทธ ์ด๋ฆ์ด ๋๋ฌด ํฐ ๊ฑฐ๋๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. Msdocs๋ ์์ฝ์์ Rune์ด ๋ฌด์์ธ์ง ๋ช ํํฉ๋๋ค. ์ฌ๋๋ค์ด ๋ฌธ์๋ฅผ ์ฝ์ง ์๋๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ๋ค ์์ ์ ๋ฌธ์ ์ ๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ฌ๊ธฐ์ ๋งํ๋ ๊ฒ์ ๋๋ค. "๋ฃฌ"์ด๋ผ๋ ์ด๋ฆ์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ์ ์ง๊ด๊ณผ ์์ ๊ฐ๋ ๊ณผ์ ์ง๊ด์ ์ธ ์ฐ๊ฒฐ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๋น์ ์ ๋ ์ฌ๋์ด ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ๋๋ก ๋ฐ์ ํ๊ฒ ์ ๋ ฌ๋์ด ์๋ค๊ณ ์ฃผ์ฅํ๊ณ ์์์ต๋๋ค. ๋ด๊ฐ ๊ทธ ์ง๊ด์ด ํ๋ ธ๊ณ ํต์ ์ด ๋งค์ฐ ๋์ ์ ์๋ค๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ์ ๋, ๋น์ ์ ๋๋ต์ ๋ณธ์ง์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด์จ๋ ๋ฌธ์๋ฅผ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค์ํ์ง ์๋ค๋ ๊ฒ์ด์์ต๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ "ํ๋ก๊ทธ๋๋จธ๋ ๋ ๋๋ํด์ ธ์ผ ํ๋ค"๋ ๋ง์ ์๋ฏธ์ ๋๋ค. ๋ฌธ์ํ๋ ์ด๋ฆ์ ๋ํ ๋ ๊ฑฐ์ ์ด์ ๊ฐ ์์ ๋ ์คํด์ ์์ง๊ฐ ์๋ ์ด๋ฆ์ ๋ํ ๋ณ๋ช ์ด ์๋๋๋ค.
๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ
Rune
๊ฐ ํนํ ๋ฃฌ ๋ฌธ์๋ผ๊ณ ์๊ฐํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ๋๋ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค. ๋ง์น ๊ทธ๋ค์ดStream
๊ฐ ์์ ๊ฐ์ด ์๋๋ผ๋ ๊ฒ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ ๋๋ค.
์ฌ๊ธฐ์ ๋ด ์ฃผ์ฅ์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ฃฌ ๋ฌธ์์ ํผ๋ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ด ์๋๋๋ค. ๋ด ์ฃผ์ฅ์ ์ฌ๋๋ค์ด ๋น์ ์ ์ฃผ์ฅ์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ๋ ์ฝ๋ ํฌ์ธํธ์ ๋งค์ฐ ๋์ ์๊ด ๊ด๊ณ๋ฅผ ๊ฐ๋ ๊ธ๋ฆฌํ, ์์ ๋ฐ ์์ ํด๋ฌ์คํฐ์ ํผ๋ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๊ฒ์ ์์๋ผ ๋งํผ ์ถฉ๋ถํ ๋๋ํ๋ค๊ณ ๋งํ๊ณ ์๋ค. ๋น์ ์ ๋ด ์ ์ ๋จ์ด๋ฅผ ๋ฃ์ด.
๊ทธ๋ค์ด ์ค์ ๊ฒ๋ฅด๋ง ๋ฃฌ์ด ์๋๋ผ๋ ๊ฒ์ ์์๋ผ ๋งํผ ๋๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ๋ค์ด ๊ธ๋ฆฌํ, ์์ ๋๋ ์์ ํด๋ฌ์คํฐ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์์๋ด๋ ค๋ฉด? ๋๋ถ๋ถ์ ์ํํธ์จ์ด์์ ์ ๋์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ํ์ง์ ๋ํ ๋์ ์ค์ ๊ฒฝํ์ ๊ทธ๋ ์ง ์๋ค๊ณ ๋งํฉ๋๋ค.
์ฌ๋๋ค์ด ๋ฌธ์๋ฅผ ์ฝ์ง ์๋๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ๋ค ์์ ์ ๋ฌธ์ ์ ๋๋ค.
์, ์ ๋ ์ด๊ฒ์ ์ง์งํฉ๋๋ค. ์ง๋ฅ์ด ๋ถ์กฑํด์๊ฐ ์๋๋ผ ์ฑ๊ธํ ๊ฐ์ ์ ํ๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ String
๊ฐ ์ค์ ๊ผฌ์์ ๋ง๋ ๊ฐํ๊ณ ์์ ๋ฐง์ค ์กฐ๊ฐ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด, ์, ๊ทธ๊ฒ์ ๊ทธ๊ฒ์ด String
๋ผ๋ ์ด๋ฆ์ ๋ฌธ์ ๋ก ๊ฐ์ฃผ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์
๋๋ค. .
ํ๋ก๊ทธ๋๋จธ๊ฐ Char
๊ฐ ์ฏ๊ณผ ๊ฐ์ ํ ์ฌ๋ฃ ๋๋ ํน์ ์ ํ์ ์ก์ด๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด Char
์ด๋ฆ์ ๋ฌธ์ ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ character
๊ฐ ์คํ ๋ฆฌํ
๋ง์ ์ฌ์ฉ๋๋ ์ผ๋ จ์ ์ ์ ์ , ์ค๋ฆฌ์ ํน์ฑ์ ๋ฌ์ฌ๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด character
๋ผ๋ ์ด๋ฆ์ ๋ฌธ์ ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๋ค.
์ด๊ฒ๋ค์ ๋ชจ๋ ํ ์คํธ/์ธ์ด ๋ฌธ์ ์ ๋๋ค. ๊ทธ๋ค์ ๋ชจ๋ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋๋จธ๋ ์ ์ ์ํ์ต๋๋ค. ์ด๋ฌํ ์ฉ์ด๋ ํด๋น ๋ถ์ผ์์ ํ๋ฆฝ๋ ๊ด์ต์ธ ๋น์ฌ ์ฉ์ด๋ก ์ธํด ์ฌ์ค์์ ํ์ค์ด ๋์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๊ฒ์ ๋ฐ๋ฅผ ๋งํผ ์ถฉ๋ถํ ๋๋ํ๋ค๋ ํ๋ฆฝ๋ ์ ๋ก๊ฐ ์์ต๋๋ค.
๋น์ ์ ๋ ์ฌ๋์ด ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ๋๋ก ๋ฐ์ ํ๊ฒ ์ ๋ ฌ๋์ด ์๋ค๊ณ ์ฃผ์ฅํ๊ณ ์์์ต๋๋ค.
์, ์ด๊ฒ์ GitHub์
๋๋ค. ์ด๋ฏธ ๋ง๊ฐ๋ ๋ฌธ์ ์์ ์ด๋ฆ์ ํ๋ฆฝ๋ ์ ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ Rune
๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ ์ด์ ์ ๋ํ ์๊ฐ์ ์ถ๊ฐํ์ต๋๋ค. ์ด๊ณณ์ ๊ด๋ฒ์ํ ์ ์์ ์ ์คํ๊ฒ ์ ํํ ๋จ์ด๋ก ๊ฐ๋ ์ฐฌ ๋
ผ๋ฌธ์ ์ฐ๊ธฐ ์ํ ์ฅ์๋ ๋งฅ๋ฝ์ด ์๋๋๋ค. ์๋ฅผ ๋ค์ด, UTF-8 ๋์ฝ๋์ ๋ํ PR์ ์
๋ ฅํ๋ ๊ฒฝ์ฐ ๋์ฒด ์ ๊ทผ ๋ฐฉ์๋ณด๋ค Hoehrmann DFA๋ฅผ ๊ตฌํํ ์ด์ ๋ฅผ ๋ช
์์ ์ผ๋ก ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค. ์ ๋ "์ฌ๊ธฐ ์์ต๋๋ค, ์ฌ๊ธฐ์ ์๋ํ๋ ์ฆ๊ฑฐ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ด๊ฐ ์ ์ด๊ฒ์ ์ฌ์ฉํ๋์ง ๋ท๋ฐ์นจํ๋ ๋ช ๊ฐ์ง ๋ฒค์น๋งํฌ๊ฐ ์์ต๋๋ค"๋ผ๊ณ ๋งํ ๊ฒ์
๋๋ค.
๋ด ์ฃผ์ฅ์ ์ฌ๋๋ค์ด ๊ธ๋ฆฌํ, ์์ ๋ฐ ์์ ํด๋ฌ์คํฐ์ ํผ๋ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์์ ์ธ๊ธํ ๊ฒ๊ณผ Tree
, Heap
, Table
, Key
, Socket
, Port
์ค ์ด๋ ๊ฒ๋ ํผ๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋งค์ฐ ๋ถํฉ๋ฆฌํ ์ฃผ์ฅ์ ๋๋ค. ํ ์กฐ๊ฐ์ ์ค๊ณผ ํ ์คํธ์ ๋ฌธ์์ด์ ์ฝ๊ฒ ํผ๋๋์ง ์์ต๋๋ค. ํค๊ฐ ํฐ ์๋ฌผ๊ณผ ๋๋ฌด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฝ๊ฒ ํผ๋๋์ง ์์ต๋๋ค. ๋ฐ๋ฉด์ ์ฝ๋ ํฌ์ธํธ๋ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋งค์ฐ ์ ์ดํดํ์ง ๋ชปํ๋ ๊ฐ๋ ์ด๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ ๋ค๋ฅธ ๋ชจ๋ ๊ฐ๋ ๊ณผ ๋์์์ด ํผ๋๋ฉ๋๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋น์ ์ด ๋งํ๋ฏ์ด ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ ํฌ์ธํธ์ ๋ํด ๊ณ ์ ํ "์๋ฆฌํ" ์ด๋ฆ์ ์ฌ์ฉํ๋ ์ธ์ด๋ _์ค์ ์ ๋์ฝ๋ ๋ฌธ์_์ ์ง์์ ํด๋น ์ธ์ด์ ์ ์ฉํ๋ ๊ฒ์ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ฅผ ์ด๋ ๊ฒ ๋ง๋ญ๋๋ค.
์ด๋ฌํ ์ฉ์ด๋ ํด๋น ๋ถ์ผ์์ ํ๋ฆฝ๋ ๊ด์ต์ธ ๋น์ฌ ์ฉ์ด๋ก ์ธํด ์ฌ์ค์์ ํ์ค์ด ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ชจ๋ ๊ฒ์ ํต์ฌ์ ๋๋ค. ๋น์ ์ "๋ฃฌ"์ด ํ๋ก๊ทธ๋๋ฐ์์ ๋๋ฆฌ ์ดํด๋๋ ์ฝ๋ ํฌ์ธํธ์ ๋ํ ์ ์ ๋ฆฝ๋ ์ฉ์ด์ด๊ฑฐ๋ ๊ทธ๋์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์๋ผ๋ฉด Go ์ด์ธ์ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฒฝํ์ด ์๋ ์ผ๋ฐ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋ค์ด๋ณธ ์ ์ด ์๋์ง ๋ฌผ์ด๋ณด์ญ์์ค. ํ์๋ผ๋ฉด ๊ณ ๋๋ก ์๋ จ๋ ๊ฐ๋ฐ์๋ผ๋ ์์ฃผ ์คํดํ๋ ์ด๋ฏธ ํผ๋์ค๋ฝ๊ณ ์ ์ดํด๋์ง ์๋ ์ํฉ์์ ๊ณต์ ์ ๋์ฝ๋ ์ฉ์ด์ ๊ฒฝ์ํ๋ ์์ ์ ๋ฌป๊ณ ์ถ์ต๋๋ค.
@Entomy ์ธ๋ถ์ธ ์
๋ ฅ: ๋ด๊ฐ ๋งํ ์ ์๋ ํ ๊ทํ์ ์ ์ฒด ์ฃผ์ฅ์ 'ํผ๋์ค๋ฝ๊ณ ์ข์ง ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํผ๋์ค๋ฝ๊ณ ๋์์ง๋ ์์ต๋๋ค'์
๋๋ค.
๊ทธ๋์? ๋์ ์ ์ค์ ๋ก ์ข์ง ์์ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ ๋์ฝ๋์ ์ด๋ฆ๊ณผ ์ ํํ ๊ฐ์ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐ ์ด๋ค ๋ฌธ์ ๊ฐ ์์ต๋๊น?
๋ํ ๋ฃฌ์ ์ผ๋ฐ์ ์ธ ์ปดํจํ
๋ถ์ผ์์ ์ฝ๋ ํฌ์ธํธ๋ ์์ ๋๋ ํด๋ฌ์คํฐ๊ฐ ์๋๋๋ค. Google์์ 'Unicode runes'๋ฅผ ๊ฒ์ํ๋ฉด ์ฝ๋ ํฌ์ธํธ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ด 2ํ์ด์ง๊น์ง ํ์๋์ง ์๊ณ ๊ทธ๋๋ godoc/Nim ๋งํฌ์ผ ๋ฟ์
๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ํธํ ์ ์๋ DuckDuckGo์์๋ ์ฌ์ ํ 2ํ์ด์ง์ ๊ฒฐ๊ณผ์
๋๋ค. ๋ฐ๋ผ์ ๋ด๊ฐ ๋ณธ ์ด๋ฆ์ ๋ํด ๋จ์ ์ ์ผํ ์ฃผ์ฅ์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ด ์ง๊ด์ ์ด์ง๋ง . ๊ทธ๊ฒ์ด ์์ ํด๋ฌ์คํฐ ๋๋ ์๋ง๋ ๋จ์ง ์์๋ฅผ ๋ํ๋ธ๋ค๋ ๊ฒ์ ์ง๊ด์ ์
๋๋ค.
์ถ์ฒ: ์ ๋ Go๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ 4๋
ํ ์ด ํธ๋ฅผ ์ฝ์ ๋๊น์ง ์ด๊ฒ์ด ์์์ธ ์ค ์์์ต๋๋ค.
(๊ทธ๋ฆฌ๊ณ '์ถฉ๋ถํ ๊ฐ๊น๊ธฐ' ๋๋ฌธ์ ์์๋ฅผ ์ ์ํด๋ ๊ด์ฐฎ๋ค๋ ๋ง์ 16๋นํธ ๋ฌธ์๊ฐ ์ถฉ๋ถํ ๊ฐ๊น๋ค๋ ๊ฒ์ ์๊ธฐ์์ผ์ค๋๋ค.)
์, ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ ๋๋ํ๊ณ ๋ ๋ง์ ๋ฌธ์๋ฅผ ์ฝ๋๋ค๋ฉด ์๋ฏธ ์๋ ์ด๋ฆ์ด๋ ์ ํ์ด ์ ํ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ char ๋์ int๋ก ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ ๊ฒ์
๋๋ค. ํ์ง๋ง ๊ทธ๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ์ง๊ธ์ฒ๋ผ ๋๋ํ๊ณ , ๊ทธ๊ฒ์ ์์ง ๋ ๋ค๋ฅธ API๊ฐ ์ถ๊ฐ๋์๋ค๊ณ ํด์ ๋ณํ์ง ์์ ๊ฒ์
๋๋ค. ๋ชฉํ๋ ์์ด ์ด์ธ์ ์ธ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ์ํํธ์จ์ด์ ์์ ๋๋ฆฌ๋ ๊ฒ์
๋๋ค. ๋จ์ํ ๋์ผํ ์์
์ ์ํํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋์
ํ๊ณ ์ด์ ๊ณผ ๋์ผํ ์ง์
์ฅ๋ฒฝ์ ์ ์งํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ ผ์์ ์ํด ๊ทธ๋ฆฌ๊ณ ๊ณผํ์ ๋ชฉ์ ์ ์ํด ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ๋์ฝ๋ ํ ์คํธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ฅ ์ ์ํํ๋ ํ๋์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ๋จ์ํจ์ ์์์ผ๋ก์จ: ์ค์ํํธ
String
๋ ์์์ ์ ๋์ฝ๋ ํ
์คํธ ๋ฒํผ์
๋๋ค.Character
๋ ๋จ์ผ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ์ด ์๋๋ผ ํ์ฅ๋ ์์ ํด๋ฌ์คํฐ์
๋๋ค. ์์ ํด๋ฌ์คํฐ ํ
์ ๋ํ ์ด ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // แ, แ
ก, แซ
UnicodeScalar
์
๋๋ค.UInt 8
๋ฐ UInt 16
๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.์ด์ C#์ด ์์ ํ Swift ์คํ์ผ์ด ๋๋๋ก ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด๊ฒ์ ๋๋ผ์ด ์ผ์ด์ง๋ง ๋ํ ์์ฒญ๋๊ฒ ๋ง์ ๋ณ๊ฒฝ๊ณผ ์์ ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ @Serentty ๊ฐ ์ง์ ํ ๋ชจ๋ ์ด์ ๋ก Swift ์คํ์ผ ์ด๋ฆ ์ง์ ์ ์ ์ํ๊ณ ํ ์คํธ ๋ฌธ์์ด์ ๊ฒฐ๊ตญ Swift ์คํ์ผ๋ก ์ ํํ ์ ์๋ ์ต์ ์ ์ด์ด ๋ก๋๋ค.
Rune
๋ณด๋ค ๋ ๋์ ์ด๋ฆ: CodeUnit32
, UnicodeScalar
, CodeUnit
, UniScalar
, UnicodeValue
, UniValue
, UnicodeScalarValue
. ์ฒ์ ๋ ๊ฐ๋ C#์ ๋ช
๋ช
๊ท์น์ ์ ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค. UnicodeScalar
๋ ๊ฐ๊ด์ ์ผ๋ก ๋ ๋์ ์ด๋ฆ์
๋๋ค. ์ฝ๋ ๋จ์๋ ์ ๋์ฝ๋ ์ฉ์ด๋ก ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ์ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ผ ๋ฟ์
๋๋ค. ๋ฐ๋ผ์ CodeUnit32
๋ UTF-32๋ก ์ธ์ฝ๋ฉ๋ ํ
์คํธ ๋ฌธ์์ด์ ์ฝ๋ ๋จ์๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ ์๋ฏธํ๋ ๋ฐ๋ฉด UnicodeScalar
๋ ์ธ์ฝ๋ฉ์ ๊ตฌ์ ๋ฐ์ง ์์ต๋๋ค.
ํธ์ง: ์, System.Rune
๋ผ๋ ์ด๋ฆ์ด ์ด๋ฏธ ๋์ ์์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ "์ด๊ฒ์ด ๋ฐ์ธ๊ธฐ๊ฐ ๋๊ธฐ ์ ์ ๋ ์ข๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด"์ผ ๋ฟ์
๋๋ค.
@ํ์ด๋ง
๋ด๊ฐ ๋งํ ์ ์๋ ํ ๊ทํ์ ์ ์ฒด ์ฃผ์ฅ์ 'ํผ๋์ค๋ฝ๊ณ ์ข์ง ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํผ๋์ค๋ฝ๊ณ ๋์์ง๋ ์์ต๋๋ค'์ ๋๋ค.
์๋, ๊ทธ๊ฒ์ ์ ํ ๋ด ์ฃผ์ฅ์ด ์๋๋๋ค. ๋๋ ๋ด๊ฐ ๊ฐ์ง ์ฅ์ ๋ฅผ ๊ฐ์ง๊ณ ์ต์ ์ ๋คํ๊ณ ์์ง๋ง ์ด๊ฒ์ ๋ด๊ฐ ์๋ํ ์์ฌ ์ํต์ด ์๋๋๋ค.
Google์์ 'Unicode runes'๋ฅผ ๊ฒ์ํ๋ฉด ์ฝ๋ ํฌ์ธํธ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ด 2ํ์ด์ง๊น์ง ํ์๋์ง ์๊ณ ๊ทธ๋๋ godoc/Nim ๋งํฌ์ผ ๋ฟ์ ๋๋ค.
Google์์ '์ ๋์ฝ๋ ๋ฌธ์์ด'์ ๊ฒ์ํ๋ฉด .NET ๋ฌธ์์ด์ด ์๋ํ๋ ๋ฐฉ์๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ธ์ ํ ๊ฒ์ ์ฐพ๋ ๋ฌธ์ ์
๋๋ค. ๋งค์ฐ ์๊ฒฉํ ๋น์ ๋ก ์ ๋ .NET๊ณผ Ada ๋ชจ๋์์ ํ๋ก๊ทธ๋๋ฐํฉ๋๋ค. string
๋ ๊ทธ๋ค ์ฌ์ด์์ ๋์ผํ์ง ์์ผ๋ฉฐ ๊ฐ๊ฐ์ ๋ํด ์ฝ๊ฐ์ ๋
์๊ฐ ์ข์ ์๊ฐ์
๋๋ค.
์ค๋ฒ๋ก๋๋ ์ ์๋ ์ธ์ด์์ ๋๋ฌธ ์ผ์ด ์๋์ง๋ง ์ฐ๋ฆฌ๋ ์ ๊ด๋ฆฌํฉ๋๋ค. ๋๋๊ฒ ์ง๋ง "run"์๋ ์ต์ 179๊ฐ์ ํ์ ์ ์๊ฐ ์๊ณ "take"์๋ ์ต์ 127๊ฐ, "break"์๋ ์ต์ "123"์ด ์์ต๋๋ค. [ ์ถ์ฒ ] ์ฌ๋๋ค์ ๋๋ผ์ธ ์ ๋๋ก ๋ฅ๋ ฅ์ด ์์ผ๋ฉฐ ์ฌ๊ธฐ์์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํ ๊ฒ์ ์ฑ๊ณต์ ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค. ์ต์ํ 2๊ฐ์ ๊ณต์์ ์ธ ์ ์๊ฐ ์๋ "๋ฃฌ"์ ๋ํ ์ฐ๋ ค๋ ์ฌ๋๋ค์ด 50๋ฐฐ ์ด์์ ๊ณผ๋ถํ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ณด์ผ ์ ์์ ๋ ๋ณด์ฆ๋์ง ์์ต๋๋ค.
๋์ฑ์ด ์ด๊ฒ์ ๊ฒ์ ์์ง ๋์์ ์ฌํ๊ฒ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒ์ ์์ง์์๋ ๋ฌด์ธ๊ฐ์ ์ฐ๊ฒฐ๋ ํ์ด์ง ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค. ๊ฐ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ์ค์น๊ฐ ๋ค๋ฅด๊ฒ ์ ์ฉ๋๋ ๋ค๋ฅธ ์์๋ ์์ต๋๋ค. .NET Rune์ ๋น๊ต์ ์ต๊ทผ์ ๊ฐ๋ ์ด๋ฏ๋ก ์ด์ ๋ํด ์ด์ผ๊ธฐํ๋ ๋ด์ฉ์ด ํจ์ฌ ์ค์ด๋ค๊ณ ์ดํดํ๋ ๋ฐ ๋ ๋ง์ ํ์ด์ง๊ฐ ์์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ํ ์๋ชป๋ ๊ฒ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฌธ์์ด ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์ฐ๊ตฌ๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด ์ง๋ ๋ช ๋ ๋์ ์๋ก์ด ๊ฒ์ด ๋์๋์ง ํ์ธํ๊ธฐ ์ํด Google์ด๋ DDG๋ฅผ ๊ฒ์ํ์ง ์์ต๋๋ค. Semantic Scholar, Google Scholar ๋ฑ์ด ๋ ๋์ ์ถ๋ฐ์ ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก .NET API์ ๋ํด ์ดํดํ๋ ค๋ฉด ๋จผ์ MSDocs๋ฅผ ๊ฒ์ํฉ๋๋ค. ๋ฌผ๋ฆฌ/๊ณตํ ์ฉ์ด์ธ "๊ด์ฑ ๋ชจ๋ฉํธ"๊ฐ ์ด๋ฆ์ด ๋ชจํธํ๊ฑฐ๋ ์คํด์ ์์ง๊ฐ ์๋ค๊ณ ๋ถํํ๊ณ ์ฒ์ ๋ช ๊ถ์ ์ฑ ์์ ๊ฐ์ฅ ๋ฎ์ ๋ฒํธ๋ถํฐ ์์ํ์ฌ ์ด์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. Dewey Decimal Classification์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ "๊ด์ฑ ๋ชจ๋ฉํธ"๋ผ๋ ์ด๋ฆ์ ์ง์ ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋ถ๋ช ํ ์๋ชป๋ ๊ณณ์ ์ฐพ๊ณ ์์ต๋๋ค.
์ถ์ฒ: ์ ๋ Go๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ 4๋ ํ ์ด ํธ๋ฅผ ์ฝ์ ๋๊น์ง ์ด๊ฒ์ด ์์์ธ ์ค ์์์ต๋๋ค.
๋๋ ์ ์ด๋ ๋ด๊ฐ ์ฐพ์ ์ ์๋ Go ๋ฌธ์์ ๋ฆด๋ฆฌ์ค ๋
ธํธ๋ฅผ ์ดํด๋ณด์๊ณ ๋น์ ์ ๋ง์ ๋์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ค์ rune
๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ๋งค์ฐ ๋ชจํธํ๊ณ ๋ถํํ๊ฒ๋ rune
๊ฐ ์ผ๋ง๋ ํฐ์ง์กฐ์ฐจ ๋ชจํธํฉ๋๋ค. ๋๋ Ada๊ฐ ๋ฐ์ดํฐ ์ ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ๋๊ฐ์ด ๋ชจํธํ ๊ฒ์ ๋ณด์๊ณ ๋ช ๋
ํ์ ์ค์ค๋ก๋ฅผ ๋ฌผ๊ณ ์๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ ์ด ๋ชจํธํจ์ด ๋์ค์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋ msdocs๊ฐ ๋งค์ฐ ์์ธํ๊ณ ๊ฐ๊ฒฐํ ์ค๋ช ์ผ๋ก ํจ์ฌ ๋ ๋์ ์์ ์ ์ํํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค.
์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ([ U+0000..U+D7FF ] ํฌํจ, ๋๋ [ U+E000..U+10FFFF ] ํฌํจ)์ ๋ํ๋ ๋๋ค.
์ฆ, ์ฃผ์์ด ๋ค์ ๋ถ์กฑํ๊ณ Rune
๊ฐ ์กด์ฌํ๋ ์ด์ ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์ ๋ํ ์ค๋ช
์ด ์ฝ๊ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค (๋ํ ์์ ์ธ๊ธ ํ ๋จ์ํ ๋ ์ค๋ช
๋ณด๋ค ๋ ์์ธํ ์ค๋ช
์์ํ ์ ์ ํ ์ฅ์) . ๊ฑฐ๊ธฐ์ ๋ช ๊ฐ์ง ๊ฐ์ ์ฌํญ์ ์ ์ํ๊ฒ ์ต๋๋ค.
@์๋ธ๋ฆฌ
๋ ผ์๊ณผ ๊ณผํ์ ๋ชฉ์ ์ ์ํด ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ ์ ๋์ฝ๋ ํ ์คํธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ฅ ์ ์ํํ๋ ํ๋์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ ์๊ฒฌ์ ๋๋ค. ๋๋ ์ ๋์ ์ผ๋ก ๋์ํฉ๋๋ค. Swift๋ ํ์คํ ์ต์ UNICODE๋ฅผ ๋ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๋๋ฃ ๊ฒํ ์ ์ฌํ ๊ฐ๋ฅํ ์ฐ๊ตฌ์ ์ธ์ฉ ์์ด๋ ์ด๊ฒ์ ๊ณผํ์ ์ฃผ์ฅ์ด ์๋๋๋ค.
์ด์ C#์ด ์์ ํ Swift ์คํ์ผ์ด ๋๋๋ก ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ด๊ฒ์ ๋๋ผ์ด ์ผ์ด์ง๋ง ๋ํ ์์ฒญ๋๊ฒ ๋ง์ ๋ณ๊ฒฝ๊ณผ ์์ ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์ํํธ์จ์ด๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
ํ ์คํธ ๋ฌธ์์ด์ ๊ฒฐ๊ตญ Swift ์คํ์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ต์ ์ ์ด์ด ๋์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์ํํธ์จ์ด๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
์, System.Rune์ด๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ "์ด๊ฒ์ด ๋ฐ์ธ๊ธฐ๊ฐ ๋๊ธฐ ์ ์ ๋ ์ข๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด"์ผ ๋ฟ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์ํํธ์จ์ด๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
๊ธฐ์กด ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ Rune
๊ฐ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ .NET Core 3.0/3.1์ ๋์์ผ๋ก ํ๋ ๊ธฐ์กด ์ํํธ์จ์ด๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋์ค์ ๋์ ๋ฐํ์์์ ๋ค๋ฅธ ์ด๋ฆ?
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ์ํํธ์จ์ด๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค.
์ธ๊ธํ๋ฏ์ด ๋๋ ์์น๊ณผ ์ด์์ฃผ์์ ๊ด์ ์์ ์ฃผ์ฅํ๊ณ ์์ต๋๋ค. ์ฌ๋ฌผ์ ํ์ค์ด ๋ง์ด ์ธ๊ธ๋์์ต๋๋ค. ๋ชจ๋ ๊ฒ์๋ ์ฝ๊ฐ์ ๋์์ค๊ฐ ์์ง๋ง:
String
์ธํฐํ์ด์ค ์์ ๋ ๋ง์ ์ด๊ฑฐ ๋ฉ์๋์ ์ ํ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋๋ System.Char
๋ฅผ ์์ ํด๋ฌ์คํฐ ์ ํ์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ๊ทธ์ ๊ฐ์ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋๋ค.System.Char
์ ๊ฐ์ ๊ธฐ์กด ์ ํ ์ด๋ฆ์ด ๋ค๋ฅธ ์ ํ์ผ๋ก ์ฉ๋๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ์, ์ด๋ ์์ฒญ๋ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ํ ๋ฌด์ฑ
์ํ ๋ณํ. ๋๋ ๊ฑฐ๊ธฐ ๋น์ ๊ณผ ํจ๊ป ์์ด์.System.Rune
๋ฅผ System.UnicodeScalar
๋๋ ์ด๋ฆ์ด ๋ฌด์์ด๋ ์ฌ์ฉ๋์ง ์๋ ์ ํ ๋ณ์นญ์ผ๋ก ๋ฐ๊พธ์ญ์์ค. Rune
๋ฅผ ์ฌ์ฉํ๋ ์ํํธ์จ์ด๋ ์ฌ์ฉ ์ค๋จ ๋ฉ๋ชจ๋ฅผ ์ ์ธํ๊ณ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํ ๊ฒ์ด๋ฉฐ ์ ์ํํธ์จ์ด๋ ๋ ๋์ ์ด๋ฆ์ ์ค์ ์ ํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์์ 4.0 Rune
๋ฅผ ๋จ์ด๋จ๋ฆฝ๋๋ค.System.Char
๋ System.CodeUnit16
๋ฑ์ ๋ณ์นญ์ผ๋ก ๋ฐ๋ ์ ์์ต๋๋ค.System.GraphemeCluster
๋ฅผ ๋ฏน์ค์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.์ฌ๊ธฐ์ ์๊ฐ์์ํ ์์์ ๋จ์ด ๋จ๋ฆฝ๋๋ค. ๋๋ System.Rune
๊ฐ ๋ชฉ์ ์ ๋ง์ง ์๋ ์ ํ ์ด๋ฆ์ด์ง๋ง ์ค์ ๋ก ์ด์ ๋ช
๋ช
์ํ๋ฅผ ๋ ์
ํ์ํค์ง๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์นจ๋ด ๋ชจ๋ ์ ๋์ฝ๋ ์ค์นผ๋ผ๋ฅผ ์ธ์ฝ๋ฉํ ์ ์๋ ์ ์ ํ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋จํ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ณด๋ค ์ ํํ ์ ๋์ฝ๋ ์ฒ๋ฆฌ ๋ฐ ๋ช
๋ช
์ถ์ธ๋ฅผ ์ ํํ ์ ์๋ ์ข์ ๊ธฐํ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋์ด ์์ ๋กญ๊ฒ ์ ์ณ๋์ ์ ์๋ ๊ธฐํ์
๋๋ค.
์๋
ํ์ธ์ System.Text.Rune
๋ผ๋ ์ด๋ฆ์ ๋ฐฐ์ก๋ ์ ํ์ด๋ฉฐ ์์ผ๋ก ์ฌ์ฉํ ์ ํ์
๋๋ค. ์ด์ ์ Rune
UnicodeScalar
๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์๋นํ(๊ทธ๋ฆฌ๊ณ ์ด๋ค) ํ ๋ก ์ด ์์์ง๋ง ๊ฒฐ๊ตญ Rune
๊ฐ ์ด๊ฒผ์ต๋๋ค. ํ์ ํ์ฌ๋ก์๋ ๋ค๋ฅธ ์ด๋ฆ์ ์ ํํ ์๊ฐ์ ํ๊ณ ์์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ด์ ์ ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์๊ณ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ํ๋ฅผ ๊ณ์ ๋ชจ๋ํฐ๋งํ ๊ฒ์ด์ง๋ง, ๊ถ๊ทน์ ์ผ๋ก ๋ช
๋ช
๋ฌธ์ ๋ฅผ ๊ณ์ํ๋ ๋ฐ ์๋น๋๋ ์๋์ง๋ ์ด์ต์ ๋ด์ง ๋ชปํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ค๋ช
์ ์ํด ๋ฌธ์์ ๋ฐ๋ผ: .NET์ System.Text.Rune
์ ํ์ ์ ๋์ฝ๋ ์ค์นผ๋ผ ๊ฐ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค. ์ด๊ฒ์ ๊ฑด์ค์ ์ํด ์ํ๋ฉ๋๋ค. ์ด๊ฒ์ Go์ rune
์ ํ๋ณด๋ค Swift์ UnicodeScalar
์ ํ๊ณผ ๋ ์ ์ฌํฉ๋๋ค.
Rune
๋ฌธ์์ ํด๋น ์ฌ์ฉ ์ฌ๋ก์ .NET์ ๋ค๋ฅธ ํ
์คํธ ์ฒ๋ฆฌ API ๋ฐ ์ ๋์ฝ๋์ ๊ฐ๋
๊ณผ ๊ด๋ จ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์ค๋ช
ํ๋ ์น์
์ ์ถ๊ฐํ๋ ค๋ ๋
ธ๋ ฅ์ด ์งํ ์ค์
๋๋ค. ์ถ์ ๋ฌธ์ ๋ https://github.com/dotnet/docs/issues/15845์ ์์ต๋๋ค. ํด๋น ์ถ์ ๋ฌธ์ ์์ ๊ฐ๋
๋ฌธ์์ ํ์ฌ ์ด์์ผ๋ก ์ฐ๊ฒฐ๋๋ ๋งํฌ๋ ์์ต๋๋ค.
๋์๊ฒ UnicodeScalar
์ ์ฃผ์ ๋จ์ ์ ์ ํ ์ด๋ฆ์ ๊ธธ์ด์ ์ ํ์ ๋ฐ์ดํฐ ํฌ๊ธฐ ์ฌ์ด์ ํฐ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ฉ์ธ์ ์ฝ๊ฐ์ ๊ณต๋ฐฑ์ด ์๋ int
์
๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ๋ฒ์ ์ฅํฉํจ์ ๊ทน๋จ์ ์ ๋๋ค.
foreach (UnicodeScalar unicodeScalar in name.EnumerateUnicodeScalars())
{
// ... unicodeScalar contains 1 int
}
๋ $#$4$ char
string
(์ด์์ ์ผ๋ก ์ฌ๋๋ค์ ๋ถํ ๊ฐ์ ํฌํจํ๋ ๋์ ์ ์ฒด ๊ฐ์ด๋ฏ๋ก char
์ด์์ ์ ์ ํ์ ์ฌ์ฉํฉ๋๋ค)
foreach (char c in name)
{
// ... c contains 1 ushort
}
Rune์ ํ์ ์ด๋ฆ ์ฅํฉํจ์ ์ ์ถฉ์์ ๋๋ค.
foreach (Rune rune in name.EnumerateRunes())
{
// ... rune contains 1 int
}
@GrabYourPitchforks
์ฌ๋ณด์ธ์! ์์งํ ๋งํด์, ๋ด๊ฐ ์ด ๋
ผ์์ ํ๋ง๋ฆฌ๊ฒ ๋ ์ด์ ๋ .NET ์ฌ๋๋ค์๊ฒ ๊ทธ ๋ฐฐ๊ฐ ํญํดํ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ๋ค๊ณ ์ค๋ํ๋ ค๋ ๊ฒ์ด ์๋๋ผ ๋จ์ํ ๋ด ์๊ฒฌ์ ํํํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๊ฒ์ ๋์ํ์ง ์๋ ์ด ์ค๋ ๋์ ๋ค๋ฅธ ์ฌ๋๋ค. C#์ด ์ค๋ซ๋์ ๊ฐ์ง๊ณ ์๋ ๊นจ์ง ๋ฌธ์ ์ ํ๊ณผ ๋ฌ๋ฆฌ ๋ง์นจ๋ด _real_ ๋ฌธ์ ์ ํ์ ๊ฐ๊ฒ ๋ ๊ฒ์ ํ๋ฅญํ๋ค๊ณ ์๊ฐํ๋ฉฐ ์ด๋ฆ์ ์์ ํ ๋ถ์ฐจ์ ์
๋๋ค. ๊ฐ๊ฒฐํจ๊ณผ ์ ํ์ฑ ์ฌ์ด์ ์์ฒญ๋ ๊ท ํ์ด ์๋ค๋ ๊ฒ์ ์ดํดํ๊ณ CodePoint
์ ๋์ ์ต์ ์ ์์น๋ฅผ โโ์ง์ ํ์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋์ํ์ง ์๋ ์ด์ ๋ฅผ ์ดํดํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ค์ ํ ๋ฒ .NET์ ์ ๋์ฝ๋ ์ง์์ ํ๋ํํ๊ธฐ ์ํด ๋ ธ๋ ฅํ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ด๊ฒ์ ์ ์ธ๊ณ์ ๋ง์ ์ฌ๋๋ค์๊ฒ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์๋ ๋ฌธ์ ์์ ๊ทธ๊ฒ์ ๋งํ๊ณ ๋ค์ ๋งํ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ๊ตฌ๊ฐ ๋ง์์ ๋ค์ง ์๊ธฐ ๋๋ฌธ์ ํ์ค์ด ๋งํ๋ ๊ฒ์ ํฌ๊ธฐํ๋ ๊ฒ์ ํด๊ฒฐ๋๋ ๊ฒ๋ณด๋ค ๋ ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ฉฐ, ์ ๋์ฝ๋์ ๋ฃฌ ์ฝ๋ ํ์ด์ง๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ ํผ๋์ค๋ฌ์ธ ๋ฟ์ ๋๋ค.
์ด๋ฆ์ด ์๋ชป๋์์ต๋๋ค.