C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: アジアロケールとは?調べるためには?


(過去ログ 167 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■96590 / inTopicNo.1)  アジアロケールとは?調べるためには?
  
□投稿者/ かる (1回)-(2020/12/23(Wed) 12:05:14)

分類:[.NET 全般] 

はじめまして。
StrConv関数の引数に VbStrConv.Narrow を渡して全角→半角変換をする処理があるのですが、
これをカルチャが「en-US」の環境下で実行すると ArgumentException が発生します。

調べると「VbStrConv.Narrow はアジアロケールでないと使えない」とあるのですが、
この「アジアロケールかどうか」を調べる方法について検索できませんでした。

どのようにすればいいのか、情報をお持ちの方はいらっしゃるでしょうか。

引用返信 編集キー/
■96592 / inTopicNo.2)  Re[1]: アジアロケールとは?調べるためには?
□投稿者/ Hongliang (1133回)-(2020/12/23(Wed) 12:42:10)
System.Threading.Thread.CurrentThread.CurrentCulture
を調べることで、現在のカルチャがどのカルチャであるか調べられます。
ちなみにStrConvの第3引数に指定するロケールIDは、カルチャオブジェクトではLCIDプロパティに対応しています。
Narrowが対応してるのは東アジア言語ですから、日本語・朝鮮語(韓国語)・漢語(中国語)ぐらいですかね。

第3引数LocaleIDに1041(日本語)を指定すれば現在のカルチャに関わらず半角化してくれます。
ただし日本語版(東アジアの諸語版)のWindowsではなく、言語パックもインストールされていない場合はやはり例外が発生するようです。
引用返信 編集キー/
■96593 / inTopicNo.3)  Re[1]: アジアロケールとは?調べるためには?
□投稿者/ 魔界の仮面弁士 (2941回)-(2020/12/23(Wed) 12:47:31)
No96590 (かる さん) に返信
> はじめまして。
> StrConv関数の引数に VbStrConv.Narrow を渡して全角→半角変換をする処理があるのですが、
> これをカルチャが「en-US」の環境下で実行すると ArgumentException が発生します。
第3引数 LocaleID に &H411 を指定してみてください。
未指定時には 0 が指定されことになり、OS 既定のロケールで処理されます。


> この「アジアロケールかどうか」を調べる方法について検索できませんでした。
例外を Catch して失敗すれば未サポート。

Enum LCID As Integer
  Us = &H409
  It = &H410
  Ja = &H411
  Ko = &H412
  [Default] = 0
End Enum
Sub Main()
  Dim sb As New System.Text.StringBuilder()
  For Each st In New String() {ChrW(&H30F4), ChrW(&HFF20), ChrW(&H3140), ChrW(&HFFB0)}
    sb.AppendLine("元字: " & st)
    For Each localeId As LCID In {LCID.Default, LCID.Us, LCID.It, LCID.Ja, LCID.Ko}
      sb.Append(" LocaleId=" & localeId & "で変換")
      Try
        sb.Append(" 半角:" & StrConv(st, VbStrConv.Narrow, localeId))
      Catch ex As Exception
        sb.Append(" 半角:Error")
      End Try
      Try
        sb.Append(" 全角: " & StrConv(st, VbStrConv.Wide, localeId))
      Catch ex As Exception
        sb.Append(" 全角:Error")
      End Try
      sb.AppendLine()
    Next
  Next
  MsgBox(sb.ToString())
End Sub
引用返信 編集キー/
■96594 / inTopicNo.4)  Re[2]: アジアロケールとは?調べるためには?
□投稿者/ かる (2回)-(2020/12/23(Wed) 13:57:24)
No96592 , No96593
お二方それぞれに回答をいただき、ありがとうございました。

例外を事前に抑えるアプローチで進めようかと思います。

> Narrowが対応してるのは東アジア言語ですから、日本語・朝鮮語(韓国語)・漢語(中国語)ぐらいですかね。

こちらの情報も参考にさせていただきます。

解決済み
引用返信 編集キー/
■96598 / inTopicNo.5)  Re[2]: アジアロケールとは?調べるためには?
□投稿者/ 魔界の仮面弁士 (2942回)-(2020/12/23(Wed) 17:55:19)
No96592 (Hongliang さん) に返信
> Narrowが対応してるのは東アジア言語ですから、日本語・朝鮮語(韓国語)・漢語(中国語)ぐらいですかね。

試してみた限りでは、たとえ東アジア圏であっても、北朝鮮などのように
LCID 値が LOCALE_CUSTOM_UNSPECIFIED (&H1000) なケースでは変換できないようです。


既に解決済みのようですが、Wide / Narrow の両方に対応している LCID の一覧を貼っておきます。


 LCID  カルチャ  英語表記                              日本語表記
-----  --------  ------------------------------------  ----------------------------------  
    1  ar        Arabic                                アラビア語
    4  zh-Hans   Chinese (Simplified)                  簡体字中国語
    4  zh-CHS    Chinese (Simplified) Legacy           簡体字中国語レガシ
   17  ja        Japanese                              日本語
   18  ko        Korean                                韓国語
 1028  zh-TW     Chinese (Traditional, Taiwan)         中国語 (繁体字、台湾)
 1041  ja-JP     Japanese (Japan)                      日本語 (日本)
 1042  ko-KR     Korean (Korea)                        韓国語 (韓国)
 2052  zh-CN     Chinese (Simplified, China)           中国語 (簡体字、中国)
 3076  zh-HK     Chinese (Traditional, Hong Kong SAR)  中国語 (繁体字、香港)
 4100  zh-SG     Chinese (Simplified, Singapore)       中国語 (簡体字、シンガポール)
 5124  zh-MO     Chinese (Traditional, Macao SAR)      中国語 (繁体字、マカオ)
30724  zh        Chinese                               中国語
31748  zh-Hant   Chinese (Traditional)                 繁体字中国語

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -