カスタムの大文字と小文字の対応規則および並べ替え規則
大文字と小文字の対応、アルファベットの順序、および項目の並べ替えの規則は、カルチャによって異なります。 これらの相違点を認識し、文字列操作の結果がカルチャによって異なる可能性があることを理解しておく必要があります。
トルコ語のアルファベットに固有の大文字と小文字の対応規則は、言語によっては大文字と小文字の対応が一部異なる例を示しています。 ほとんどのラテン語アルファベットでは、文字 "I" (Unicode 0069) は文字 "I" (Unicode 0049) の小文字です。 それに対し、トルコ語のアルファベットでは文字 "I" に 2 つのバージョンがあります。1 つはドット付きで、もう 1 つはドットなしです。 トルコ語では、文字 "I" (Unicode 0049) は別の文字 "I" (Unicode 0131) の大文字と見なされます。 文字 "I" (Unicode 0069) は、さらに別の文字 "İ" (Unicode 0130) の小文字と見なされます。 このため、大文字と小文字を区別せずに、文字 "I" (Unicode 0069) と "I" (Unicode 0049) の文字列比較を行った場合、ほとんどのカルチャでは成功しますが、トルコ語 (トルコ) のカルチャ "tr-TR" では失敗します。
メモ |
---|
アゼリ語 (アゼルバイジャン、ラテン文字) のカルチャ "az-Latn-AZ" もこれと同じ大文字と小文字の対応規則を使用します。 |
文字列 "FILE" と "file" に対し、大文字小文字を区別しない String.Compare 操作を実行したとき、カルチャによって結果がどのように異なるかを次のコード例で示します。 Thread.CurrentThread.CurrentCulture プロパティが "en-US" と呼ばれる英語 (U.S.) のカルチャに設定されている場合は、この比較操作によって true が返されます。 現在のカルチャが "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 範囲 (Unicode 0000 ~ Unicode 007F) の 9 つのカルチャのアルファベットには、大文字と小文字が混在する場合に、String.Compare などの大文字と小文字を区別しない比較において異なる結果になる 2 文字のペアが含まれています。 それらのカルチャは以下のとおりです。
クロアチア語 (クロアチア)、"hr-HR"
チェコ語 (チェコ共和国)、"cs-CZ"
スロベニア語 (スロベニア)、"sk-SK"
デンマーク語 (デンマーク)、"da-DK"
ノルウェー語 (ブークモール、ノルウェー)、"nb-NO"
ノルウェー語 (ニノーシク、ノルウェー)、"nn-NO"
ハンガリー語 (ハンガリー)、"hu-HU"
ベトナム語 (ベトナム)、"vi-VN"
スペイン語 (スペイン、従来の並べ替え順序)、"es-ES_tradnl"
たとえば、デンマーク語では、2 文字のペア "aA" と "AA" を大文字と小文字を区別せずに比較した結果は同じであるとは見なされません。 ベトナム語のアルファベットでは、2 文字のペア "nG" と "NG" を大文字と小文字を区別せずに比較した結果は同じであるとは見なされません。 このような規則があることに注意する必要がありますが、実際には、これらのペアについてカルチャに依存した比較を行っても、通常、問題が発生することはありません。なぜなら、これらのペアが固定文字列や識別子で使用されることはほとんどないからです。
ASCII 範囲の 6 つのカルチャのアルファベットでは、大文字と小文字の区別の規則は同じですが、並べ替えの規則が異なります。 このような特徴を持つカルチャは以下のとおりです。
エストニア語 (エストニア)、"et-EE"
フィンランド語 (フィンランド)、"fi-FI"
ハンガリー語 (ハンガリー、技術的な並べ替え順序)、"hu-HU_technl"
リトアニア語 (リトアニア)、"lt-LT"
スウェーデン語 (フィンランド)、"sv-FI"
スウェーデン語 (スウェーデン)、"sv-SE"
たとえば、スウェーデン語のアルファベットでは、文字 "w" は "v" として並べ替えられます。 アプリケーション コードでは、並べ替え操作は等値比較よりも使用頻度が低いので、問題が発生することはほとんどありません。
ASCII 範囲外のその他の 35 個のカルチャには、カスタムの大文字と小文字の対応規則および並べ替えの規則があります。 これらの規則は、一般的に、特定のカルチャで使用されるアルファベットに限定されます。 したがって、これらの規則が問題となる可能性は高くありません。
特定のカルチャに対応するカスタムの大文字と小文字の対応規則および並べ替えの規則の詳細については、Unicode のホーム ページの「The Unicode Standard」を参照してください。