사용자 지정 대/소문자 매핑 및 정렬 규칙
업데이트: 2007년 11월
대/소문자 매핑, 사전순 및 항목의 순서 지정 규칙은 문화권마다 다릅니다. 이러한 차이를 인식하고 이로 인해 문자열 작업의 결과가 문화권에 따라 달라질 수 있다는 점을 이해해야 합니다.
터키어 알파벳의 독특한 대/소문자 매핑 규칙을 보면 거의 같은 문자를 사용하는 경우에도 언어마다 대/소문자 매핑이 어떻게 다른지 알 수 있습니다. 대부분의 라틴어 알파벳에서는 문자 "I"(유니코드 0069)가 문자 "I"(Unicode 0049)의 소문자입니다. 그러나 터키어 알파벳에서는 문자 "I"에 점이 있는 버전과 점이 없는 버전이 있습니다. 터키어에서 문자 "I"(유니코드 0049)는 다른 문자 "I"(유니코드 0131)의 대문자 버전으로 간주됩니다. 문자 "I"(유니코드 0069)는 또 다른 문자 "İ"(유니코드 0130)의 소문자 버전으로 간주됩니다. 따라서 대부분의 문화권에서는 대/소문자를 구분하지 않고 문자열을 비교할 때 문자 "I"(유니코드 0069)와 "I"(유니코드 0049)가 서로 같은 것으로 간주되지만 "tr-TR"로 지정되는 터키어(터키) 문화권에서는 그렇지 않습니다.
참고: |
---|
"az-Latn-AZ"로 지정되는 아제리어(아제르바이잔, 라틴 문자) 문화권에서도 이러한 대/소문자 매핑 규칙이 사용됩니다. |
다음 코드 예제에서는 대/소문자를 구분하지 않고 Compare() 작업을 수행하여 문자열 "FILE"과 "file"을 비교한 결과가 문화권에 따라 다르다는 점을 보여 줍니다. 이때 CurrentCulture 속성이 "en-US"로 지정되는 영어(미국) 문화권으로 설정되어 있으면 true가 반환되지만, CurrentCulture가 "tr-TR"로 지정되는 터키어(터키)로 설정되어 있으면 false가 반환됩니다.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class TurkishISample
Public Shared Sub Main()
' Set the CurrentCulture property to English in the U.S.
Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Console.WriteLine("Culture = {0}", _
Thread.CurrentThread.CurrentCulture.DisplayName)
Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
"FILE", True) = 0)
' Set the CurrentCulture property to Turkish in Turkey.
Thread.CurrentThread.CurrentCulture = New CultureInfo("tr-TR")
Console.WriteLine("Culture = {0}", _
Thread.CurrentThread.CurrentCulture.DisplayName)
Console.WriteLine("(file == FILE) = {0}", String.Compare("file", _
"FILE", True) = 0)
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class TurkishISample
{
public static void Main()
{
// Set the CurrentCulture property to English in the U.S.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("Culture = {0}",
Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}", (string.Compare("file",
"FILE", true) == 0));
// Set the CurrentCulture property to Turkish in Turkey.
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
Console.WriteLine("Culture =
{0}",Thread.CurrentThread.CurrentCulture.DisplayName);
Console.WriteLine("(file == FILE) = {0}", (string.Compare("file",
"FILE", true) == 0));
}
}
다음 출력에서는 대/소문자를 구분하지 않고 "I"와 "I"를 비교한 결과가 "en-US" 문화권에서는 true이고 "tr-TR" 문화권에서는 false이므로 문화권에 따라 결과가 달라짐을 알 수 있습니다.
Culture = English (United States)
(file == FILE) = True
Culture = Turkish (Turkey)
(file == FILE) = False
추가 사용자 지정 대/소문자 매핑 및 정렬 규칙
터키어와 아제리어 알파벳에 사용되는 특수한 대/소문자 매핑 외에도 문자열 작업을 수행할 때 고려해야 하는 다른 사용자 지정 대/소문자 매핑 및 정렬 규칙이 있습니다. ASCII 범위(유니코드 0000 - 유니코드 007F)에 포함된 아홉 가지 문화권의 알파벳에는 대/소문자가 혼합된 경우 Compare() 등을 사용하여 대/소문자를 구분하지 않고 비교할 때 서로 다른 것으로 나타나는 두 문자 쌍이 들어 있습니다. 이러한 문화권은 다음과 같습니다.
크로아티아어(크로아티아), "hr-HR"
체코어(체코), "cs-CZ"
슬로바키아어(슬로베니아), "sk-SK"
덴마크어(덴마크), "da-DK"
노르웨이어(복말, 노르웨이), "nb-NO"
노르웨이어(니노르스크, 노르웨이), "nn-NO"
헝가리어(헝가리), "hu-HU"
베트남어(베트남), "vi-VN"
스페인어(스페인, 전통 정렬 순서), "es-ES_tradnl"
예를 들어 덴마크어에서 대/소문자를 구분하지 않고 두 문자 쌍 "aA"와 "AA"를 비교하면 서로 다른 것으로 간주됩니다. 베트남어 알파벳에서는 대/소문자를 구분하지 않고 두 문자 쌍 "nG"와 "NG"를 비교하면 서로 다른 것으로 간주됩니다. 이러한 규칙이 있긴 하지만 실제로 이러한 문자 쌍이 고정 문자열이나 식별자에는 별로 사용되지 않으므로 이러한 문자 쌍을 문화권으로 구분하여 비교해도 문제가 발생하는 경우는 많지 않습니다.
ASCII 범위에 있는 여섯 가지 문화권의 알파벳에는 표준 대/소문자 규칙이 적용되지만 정렬 규칙은 다릅니다. 이러한 문화권은 다음과 같습니다.
에스토니아어(에스토니아), "et-EE"
핀란드어(핀란드), "fi-FI"
헝가리어(헝가리, 기술적인 정렬 순서), "hu-HU_technl"
리투아니아어(리투아니아), "lt-LT"
스웨덴어(핀란드), "sv-FI"
스웨덴어(스웨덴), "sv-SE"
예를 들어 스웨덴어 알파벳에서 문자 "w"는 문자 "v"와 동일하게 정렬됩니다. 응용 프로그램 코드에서는 정렬 작업이 같음 비교보다도 드물게 사용되므로 문제가 발생할 가능성은 더 낮습니다.
ASCII 범위 외의 35개의 추가 문화권이 사용자 지정 대/소문자 매핑 및 정렬 규칙을 갖습니다. 이러한 규칙은 일반적으로 특정 문화권에 사용되는 알파벳으로 국한됩니다. 따라서 이로 인해 문제가 발생할 가능성은 낮습니다.
특정 문화권에 적용되는 사용자 지정 대/소문자 매핑 및 정렬 규칙에 대한 자세한 내용은 Unicode 홈 페이지에서 유니코드 표준을 참조하십시오.