2016-03-26T17:02:53の更新内容

programming/netfx/locale/0_abstract/index.wiki.txt

current previous
85,7 85,7
 
CurrentUICulture: ja-JP
CurrentUICulture: ja-JP
 
}}
}}
 

        

        
~
デフォルトでは、スレッドのカルチャには[[システムのロケールに該当するカルチャ>#initial_thread_culture]]が設定されていますが、[[任意の時点で変更する>#set_thread_culture]]ことが出来ます。
デフォルトでは、スレッドのカルチャにはシステムのロケールに該当するカルチャが設定されていますが、任意の時点で変更することが出来ます。
 

        

        
 
**スレッドのカルチャの変更 [#set_thread_culture]
**スレッドのカルチャの変更 [#set_thread_culture]
 
スレッドのカルチャを変更するには、設定したいカルチャのCultureInfoを取得もしくは作成し、Thread.CurrentCultureプロパティに設定します。 現在のスレッドのカルチャを変更するにはThread.CurrentThread.CurrentCultureプロパティを設定します。
スレッドのカルチャを変更するには、設定したいカルチャのCultureInfoを取得もしくは作成し、Thread.CurrentCultureプロパティに設定します。 現在のスレッドのカルチャを変更するにはThread.CurrentThread.CurrentCultureプロパティを設定します。
240,7 240,6
 
}}
}}
 

        

        
 

        

        
+

          
 
**カルチャと書式・テキスト処理 [#format_provider]
**カルチャと書式・テキスト処理 [#format_provider]
 
いくつかのクラスやメソッドでは、カルチャよって異なる結果を返すものがあります。 一つの例として、&msdn(netfx,member,System.DateTime.ToString){DateTime.ToStringメソッド};は、書式を指定しなかった場合は現在のカルチャに設定されている書式に従って文字列化します。
いくつかのクラスやメソッドでは、カルチャよって異なる結果を返すものがあります。 一つの例として、&msdn(netfx,member,System.DateTime.ToString){DateTime.ToStringメソッド};は、書式を指定しなかった場合は現在のカルチャに設定されている書式に従って文字列化します。
 

        

        
307,80 306,12
 

        

        
 
カルチャによって結果が変わることが問題となる場合は、明示的に書式やカルチャを指定するか、[[インバリアントカルチャ(後述)>#invariant_culture]]を使用することが出来ます。 カルチャを考慮した文字列操作については、[[programming/netfx/string/2_2_compareoptions]]でも詳しく解説しているのでご覧ください。
カルチャによって結果が変わることが問題となる場合は、明示的に書式やカルチャを指定するか、[[インバリアントカルチャ(後述)>#invariant_culture]]を使用することが出来ます。 カルチャを考慮した文字列操作については、[[programming/netfx/string/2_2_compareoptions]]でも詳しく解説しているのでご覧ください。
 

        

        
+

          
+
#remarks
+
スレッドのカルチャを変更せず、一時的に特定のカルチャでの書式に基づいた文字列化を行いたい場合には、ToStringメソッドの引数にCultureInfoを指定することでそのカルチャに応じた書式での文字列化を行うことができます。 このとき''書式指定子''を同時に指定すれば、対応するカルチャにローカライズされた書式が用いられます。
+

          
+
#tabpage(codelang=cs,container-title=特定のカルチャでの書式で文字列化する)
+
#code{{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6);
+

          
+
    // 現在のカルチャ(ja-JP)で日時を文字列化
+
    Console.WriteLine(dateTime.ToString());
+

          
+
    // en-US(英語/アメリカ合衆国)のカルチャの書式で日時を文字列化
+
    Console.WriteLine(dateTime.ToString(new CultureInfo("en-US")));
+

          
+
    // de-DE(ドイツ語/ドイツ)のカルチャの書式で日時を文字列化
+
    Console.WriteLine(dateTime.ToString(new CultureInfo("de-DE")));
+

          
+
    // de-DE(ドイツ語/ドイツ)のカルチャの書式(F:完全な日付と日時)で日時を文字列化
+
    Console.WriteLine(dateTime.ToString("F", new CultureInfo("de-DE")));
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim dateTime As New DateTime(2000, 1, 23, 4, 5, 6)
+

          
+
    ' 現在のカルチャ(ja-JP)で日時を文字列化
+
    Console.WriteLine(dateTime.ToString())
+

          
+
    ' en-US(英語/アメリカ合衆国)のカルチャの書式で日時を文字列化
+
    Console.WriteLine(dateTime.ToString(New CultureInfo("en-US")))
+

          
+
    ' de-DE(ドイツ語/ドイツ)のカルチャの書式で日時を文字列化
+
    Console.WriteLine(dateTime.ToString(New CultureInfo("de-DE")))
+

          
+
    ' de-DE(ドイツ語/ドイツ)のカルチャの書式(F:完全な日付と日時)で日時を文字列化
+
    Console.WriteLine(dateTime.ToString("F", new CultureInfo("de-DE")))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
2000/01/23 4:05:06
+
1/23/2000 4:05:06 AM
+
23.01.2000 04:05:06
+
Sonntag, 23. Januar 2000 04:05:06
+
}}
+

          
+
この例におけるCultureInfoは''書式プロバイダ''として用いられます。 書式プロバイダについて詳しくは[[programming/netfx/locale/1_infoes]]で解説しています。 書式指定子の種類、およびローカライズされる/されない書式指定子については[[programming/netfx/string_formatting/0_formatstrings]]で解説しています。
+
#remarks-end
+

          
+

          
 
**インバリアントカルチャ [#invariant_culture]
**インバリアントカルチャ [#invariant_culture]
 
前述したとおり、CultureInfoには特定の言語や国・地域で用いられる書式や文字列比較の規則などが設定されていますが、それとは別に''インバリアントカルチャ''と呼ばれる特定の言語や国・地域に依存しない特別なカルチャが用意されています。 インバリアントカルチャには英語圏で使われるものを基本とする書式・規則が設定されていて、特定のカルチャに依存しない形式への変換や比較を行いたい場合に使用します。 &msdn(netfx,member,System.Globalization.CultureInfo.InvariantCulture){CultureInfo.InvariantCultureプロパティ};を参照することでインバリアントカルチャを表すCultureInfoを取得することが出来ます。
前述したとおり、CultureInfoには特定の言語や国・地域で用いられる書式や文字列比較の規則などが設定されていますが、それとは別に''インバリアントカルチャ''と呼ばれる特定の言語や国・地域に依存しない特別なカルチャが用意されています。 インバリアントカルチャには英語圏で使われるものを基本とする書式・規則が設定されていて、特定のカルチャに依存しない形式への変換や比較を行いたい場合に使用します。 &msdn(netfx,member,System.Globalization.CultureInfo.InvariantCulture){CultureInfo.InvariantCultureプロパティ};を参照することでインバリアントカルチャを表すCultureInfoを取得することが出来ます。
 

        

        
+

          
+

          
 
インバリアントカルチャが有効に機能する一つの例を見てみます。 StreamWriterを使ってDouble型のデータをファイルに保存することを考えます。
インバリアントカルチャが有効に機能する一つの例を見てみます。 StreamWriterを使ってDouble型のデータをファイルに保存することを考えます。
 

        

        
~
#tabpage(codelang=cs,container-title=StreamWriterを使ってDouble型の値をファイルに保存する)
#tabpage(codelang=cs)
 
#code{{
#code{{
 
using System;
using System;
 
using System.IO;
using System.IO;
427,7 358,7
 

        

        
 
次に、このファイルを読み込んでみます。
次に、このファイルを読み込んでみます。
 

        

        
~
#tabpage(codelang=cs,container-title=StreamReaderを使ってDouble型の値をファイルから読み込む)
#tabpage(codelang=cs)
 
#code{{
#code{{
 
using System;
using System;
 
using System.IO;
using System.IO;
486,17 417,14
 
   場所 Sample.Main()
   場所 Sample.Main()
 
}}
}}
 

        

        
~
これは、fr-FRの環境では小数点区切りに ''.'' (ピリオド)ではなく '','' (カンマ)が用いられることが理由で、これにより文字列"``1234.5678``"はDouble型の値としては不正な形式とみなされるためです。 (fr-FRの環境では実数値に"``1234,5678``"という表記が用いられる)
これは、fr-FRの環境では小数点区切りには ''.'' (ピリオド)ではなく '','' (カンマ)が用いられるためで、これによりDouble型の値としては不正な形式の文字列とみなされるためです。
 

        

        
-
もちろん、保存と読み込みを同じカルチャで実行すれば問題とはなりません。 しかし、異なるカルチャで実行した場合に結果が変わることが問題となる場合には、インバリアントカルチャを使うことでこのような問題が発生することを避けることが出来ます。
 

        

        
-
次のコードは、先のコードをインバリアントカルチャを使って保存・読み込みするように書き換えたものです。 この例では、インバリアントカルチャを書式プロバイダとして使用しています。 この点については[[programming/netfx/locale/1_infoes]]で詳しく解説します。
 

        

        
~

          
#tabpage(codelang=cs,container-title=保存用のコード)
~
もちろん、保存と読み込みを同じカルチャで実行すれば問題とはなりません。 しかし、複数の異なるカルチャ間でやりとりするようなデータを保存・読み込みするコードなど、異なるカルチャで実行した場合に結果が変わることが問題となる場合には、''インバリアントカルチャ''を使うことでこのような問題が発生することを避けることが出来ます。
#code{{
+

          
+
次のコードは、先のコードをインバリアントカルチャを使って保存・読み込みするように書き換えたものです。 この例では、インバリアントカルチャを''書式プロバイダ''として使用しています。 (書式プロバイダについては[[programming/netfx/locale/1_infoes]]で詳しく解説しています)
+

          
+
#tabpage(codelang=cs)
+
#code(cs,インバリアントカルチャを用いた保存用のコード){{
 
using System;
using System;
 
using System.Globalization;
using System.Globalization;
 
using System.IO;
using System.IO;
515,7 443,7
 
  }
  }
 
}
}
 
}}
}}
~
#code(cs,インバリアントカルチャを用いた読み込み用のコード){{
#code(cs,読み込み用のコード){{
 
using System;
using System;
 
using System.Globalization;
using System.Globalization;
 
using System.IO;
using System.IO;
537,7 465,7
 
}
}
 
}}
}}
 
#tabpage(codelang=vb)
#tabpage(codelang=vb)
~
#code(vb,インバリアントカルチャを用いた保存用のコード){{
#code{{
 
Imports System
Imports System
 
Imports System.Globalization
Imports System.Globalization
 
Imports System.IO
Imports System.IO
555,7 483,7
 
  End Sub
  End Sub
 
End Class
End Class
 
}}
}}
~
#code(vb,インバリアントカルチャを用いた読み込み用のコード){{
#code(vb,読み込み用のコード){{
 
Imports System
Imports System
 
Imports System.Globalization
Imports System.Globalization
 
Imports System.IO
Imports System.IO
577,8 505,6
 
}}
}}
 
#tabpage-end
#tabpage-end
 

        

        
+
このように、特定のカルチャに依存した動作となることを避けたい場合には、その代替としてインバリアントカルチャを用います。
+

          
 
なお、文字列関連のクラスでは[[String.ToLowerInvariant>programming/netfx/string/1_operations#String.ToUpperToLower]]などのメソッドや、[[StringComparisonを指定することができるメソッド>programming/netfx/string/2_2_compareoptions#StringComparison]]でStringComparison.InvariantCultureを指定することによってもインバリアントカルチャの規則を使った処理を行うことができるようになっています。
なお、文字列関連のクラスでは[[String.ToLowerInvariant>programming/netfx/string/1_operations#String.ToUpperToLower]]などのメソッドや、[[StringComparisonを指定することができるメソッド>programming/netfx/string/2_2_compareoptions#StringComparison]]でStringComparison.InvariantCultureを指定することによってもインバリアントカルチャの規則を使った処理を行うことができるようになっています。
 

        

        
 
**ニュートラルカルチャ [#neutral_culture]
**ニュートラルカルチャ [#neutral_culture]
591,271 517,6
 
なお、ニュートラルカルチャを取得するには"ja"や"en"などの言語コードのみを指定します。 CultureInfoがニュートラルカルチャかどうか調べるには、&msdn(netfx,member,System.Globalization.CultureInfo.IsNeutralCulture){IsNeutralCultureプロパティ};を参照します。
なお、ニュートラルカルチャを取得するには"ja"や"en"などの言語コードのみを指定します。 CultureInfoがニュートラルカルチャかどうか調べるには、&msdn(netfx,member,System.Globalization.CultureInfo.IsNeutralCulture){IsNeutralCultureプロパティ};を参照します。
 

        

        
 

        

        
+

          
+

          
+

          
+

          
+
**初期状態でのスレッドのカルチャ [#initial_thread_culture]
+
実行時の初期状態では、スレッドのカルチャにはシステムで設定されているものと同じカルチャが設定されます。
+

          
+
Windowsでは、コントロールパネルにおける地域と言語の設定に対応するカルチャが設定されます。 この設定を変更すると、以降に起動するプロセスにおけるカルチャの初期値に影響します。
+

          
+
Linux等では、環境変数``LANG``に設定されている値に対応するカルチャが設定されます。 環境変数``LANG``を変更すると、以降に起動するプロセスにおけるカルチャの初期値に影響します。
+

          
+
#tabpage(codelang=cs,container-title=実行時の初期状態におけるスレッドのカルチャ)
+
#code{{
+
using System;
+
using System.Globalization;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 実行時の初期状態におけるスレッドのカルチャを表示する
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture);
+
    Console.WriteLine("CurrentUICulture: {0}", CultureInfo.CurrentUICulture);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Globalization
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 実行時の初期状態におけるスレッドのカルチャを表示する
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture)
+
    Console.WriteLine("CurrentUICulture: {0}", CultureInfo.CurrentUICulture)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果例(Ubuntu 14.04 + Mono)){{
+
$ env | grep LANG=
+
LANG=ja_JP.UTF-8
+
$ mono test.exe
+
CurrentCulture: ja-JP
+
CurrentUICulture: ja-JP
+

          
+
$ LANG=en-US
+
$ env | grep LANG=
+
LANG=en-US
+
$ mono test.exe
+
CurrentCulture: en-US
+
CurrentUICulture: en-US
+
}}
+

          
+

          
+
***新しく起動したスレッドのカルチャ
+
新しくスレッドを起動した場合、そのスレッドのカルチャにはシステムに設定されているカルチャが設定されます。 ''現在のスレッドのカルチャは生成されたスレッドには引き継がれない''点に注意が必要です。
+

          
+
#tabpage(codelang=cs,container-title=新しく起動したスレッドには現在のスレッドのカルチャは引き継がれない)
+
#code{{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+

          
+
    // 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture);
+

          
+
    // 新しいスレッドを作成して起動する
+
    var t = new Thread(NewThread);
+

          
+
    t.Start();
+
    t.Join();
+
  }
+

          
+
  static void NewThread()
+
  {
+
    // 開始されたスレッドでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new thread): {0}", CultureInfo.CurrentCulture);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
+

          
+
    ' 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture)
+

          
+
    ' 新しいスレッドを作成して起動する
+
    Dim t As New Thread(AddressOf NewThread)
+

          
+
    t.Start()
+
    t.Join()
+
  End Sub
+

          
+
  Shared Sub NewThread()
+
    ' 開始されたスレッドでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new thread): {0}", CultureInfo.CurrentCulture)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
CurrentCulture: en-US
+
CurrentCulture (new thread): ja-JP
+
}}
+

          
+

          
+

          
+

          
+
この動作は、&msdn(netfx,type,System.Threading.ThreadPool){ThreadPoolクラス};で起動したスレッドプールや、&msdn(netfx,type,System.Threading.Tasks.Task){Taskクラス};で起動したタスクの場合でも同様です。
+

          
+
#tabpage(codelang=cs,container-title=新しく起動したタスクには現在のスレッドのカルチャは引き継がれない)
+
#code{{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+
using System.Threading.Tasks;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+

          
+
    // 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture);
+

          
+
    // 新しいタスクを作成して起動する
+
    var t = Task.Factory.StartNew(NewTask);
+

          
+
    t.Wait();
+
  }
+

          
+
  static void NewTask()
+
  {
+
    // 開始されたタスクでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new task): {0}", CultureInfo.CurrentCulture);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+
Imports System.Threading.Tasks
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
+

          
+
    ' 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture)
+

          
+
    ' 新しいタスクを作成して起動する
+
    Dim t As Task = Task.Factory.StartNew(AddressOf NewTask)
+

          
+
    t.Wait()
+
  End Sub
+

          
+
  Shared Sub NewTask()
+
    ' 開始されたタスクでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new task): {0}", CultureInfo.CurrentCulture)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
CurrentCulture: en-US
+
CurrentCulture (new task): ja-JP
+
}}
+

          
+

          
+

          
+
スレッドを起動する際に同じカルチャで動作させたい場合は、次のようにCurrentCultureプロパティ(およびCurrentUICultureプロパティ)を明示的に設定してから起動する必要があります。
+

          
+
#tabpage(codelang=cs,container-title=新しく作成したスレッドのカルチャを変更してから起動する)
+
#code{{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
+

          
+
    // 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture);
+

          
+
    // 新しいスレッドを作成する
+
    var t = new Thread(NewThread);
+

          
+
    // 現在のスレッドと同じカルチャを設定してから起動する
+
    t.CurrentCulture = Thread.CurrentThread.CurrentCulture;
+

          
+
    t.Start();
+
    t.Join();
+
  }
+

          
+
  static void NewThread()
+
  {
+
    // 開始されたスレッドでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new thread): {0}", CultureInfo.CurrentCulture);
+
  }
+
}
+
}}
+
#tabpage(codelang=vb)
+
#code{{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在のスレッドのカルチャを変更
+
    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
+

          
+
    ' 現在のスレッドのカルチャを表示
+
    Console.WriteLine("CurrentCulture: {0}", CultureInfo.CurrentCulture)
+

          
+
    ' 新しいスレッドを作成する
+
    Dim t As New Thread(AddressOf NewThread)
+

          
+
    ' 現在のスレッドと同じカルチャを設定してから起動する
+
    t.CurrentCulture = Thread.CurrentThread.CurrentCulture
+

          
+
    t.Start()
+
    t.Join()
+
  End Sub
+

          
+
  Shared Sub NewThread()
+
    ' 開始されたスレッドでのカルチャを表示
+
    Console.WriteLine("CurrentCulture (new thread): {0}", CultureInfo.CurrentCulture)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
CurrentCulture: en-US
+
CurrentCulture (new thread): en-US
+
}}
+

          
+

          
+

          
 
*カルチャ情報の取得 (CultureInfo)
*カルチャ情報の取得 (CultureInfo)
 
**カルチャに固有な情報の取得
**カルチャに固有な情報の取得
 
CultureInfoクラスのプロパティを参照することで、カルチャに固有な情報を取得することが出来ます。 ロケールの固有なIDである&msdn(netfx,member,System.Globalization.CultureInfo.LCID){LCID};を始め、ISO 639-2形式の言語コードISOを取得する&msdn(netfx,member,System.Globalization.CultureInfo.TwoLetterISOLanguageName){TwoLetterISOLanguageName};、&msdn(netfx,member,System.Globalization.CultureInfo.ThreeLetterISOLanguageName){ThreeLetterISOLanguageName};などのプロパティがあります。
CultureInfoクラスのプロパティを参照することで、カルチャに固有な情報を取得することが出来ます。 ロケールの固有なIDである&msdn(netfx,member,System.Globalization.CultureInfo.LCID){LCID};を始め、ISO 639-2形式の言語コードISOを取得する&msdn(netfx,member,System.Globalization.CultureInfo.TwoLetterISOLanguageName){TwoLetterISOLanguageName};、&msdn(netfx,member,System.Globalization.CultureInfo.ThreeLetterISOLanguageName){ThreeLetterISOLanguageName};などのプロパティがあります。