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

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

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

Re[3]: 英語版OSでVBのStrConvを使用


(過去ログ 129 を表示中)

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

■76505 / inTopicNo.1)  英語版OSでVBのStrConvを使用
  
□投稿者/ ヒークン (1回)-(2015/07/16(Thu) 11:21:55)

分類:[VB.NET/VB2005 以降] 

VB2008で作成したソフトが、英語版OS(Windows2007 US)で
うまく動作しないという問題が発生しました。
どうやら、半角⇔全角変換に使用しているStrConvで例外が発生しているようで、
この環境ではStrConvが使えない、という所までは理解しました。

StrConvを含めた箇所をすべて修正するには時間がかかると思いますので、
それ以外にこの問題を回避する方法はありますでしょうか?

例えば、.NET Frameworkの日本語 Language Packを該当PCに
インストールすれば解決するのでしょうか?
(その場合、インストールするバージョンは3.5SP1でしょうか、4でしょうか?)
そのPCが手元にあれば、色々と試すことができるのですが、
ここら辺をよく理解しておりません。

何卒宜しくお願い申し上げます。
引用返信 編集キー/
■76506 / inTopicNo.2)  Re[1]: 英語版OSでVBのStrConvを使用
□投稿者/ shu (763回)-(2015/07/16(Thu) 12:00:09)
No76505 (ヒークン さん) に返信

StrConvをどのように使用しているかによりますが
他の処理で置き換えられるなら
用意されているStrConv関数をマスクしてしまうという
方法があります。

プロジェクト内にModuleを1つ作成してその中に
既存のStrConvと同じインターフェースの同名関数を
定義してしまいます。その関数内で日本語環境ならそのまま
既存関数を呼ぶ(Microsoft.VisualBasic.StrConvを実行)
そうでない環境なら同等の処理を行うようコードを作成します。
引用返信 編集キー/
■76507 / inTopicNo.3)  Re[2]: 英語版OSでVBのStrConvを使用
□投稿者/ daive (68回)-(2015/07/16(Thu) 12:08:29)
>そのPCが手元にあれば、色々と試すことができるのですが
具体的に、MSDNで配布されているOS名がわかれば、
Hyper-V / VirtualBOX / VMWare 等で、仮想環境対応が可能かもしれません。
⇒MSDN 有償ライセンス
 VHDイメージの、評価版が公開されているOSもあります。
 Professional位の、VLライセンス3年版だと、1年辺りそれほどでも無いですが、
 OFFICE 迄含む場合は、結構高くなります。
 古くは、Windows 7 の XP mode では、日本語、英語他が、実行できました。
 (入手OSイメージによります。今でも、手に入るかどうかは、未調査)

>VB2008で作成したソフトが、英語版OS(Windows2007 US)で
私の、勉強が足りないのでしょうが、、
Windows2007 US
については、知りません。
Windows Home Server : 2007年リリース?
でしょうか?
embed 系では、
Windows XP Embedded
Windows Embeded Standard 2009:Windows 2009 などの表記がある場合も
Windows Embeded Server
とか


引用返信 編集キー/
■76508 / inTopicNo.4)  Re[1]: 英語版OSでVBのStrConvを使用
□投稿者/ 魔界の仮面弁士 (409回)-(2015/07/16(Thu) 12:15:02)
No76505 (ヒークン さん) に返信
> VB2008で作成したソフトが、英語版OS(Windows2007 US)で

Windows 2007 という OS はありませんよ。(Office 2007 ならありますが)
海賊版だったりはしないですよね…? (^_^;)


> どうやら、半角⇔全角変換に使用しているStrConvで例外が発生しているようで、
> この環境ではStrConvが使えない、という所までは理解しました。

環境が無いので試せませんが、StrConv の第3引数を指定しても駄目でしょうか?
日本語のロケールID は 1041 です。
https://msdn.microsoft.com/ja-jp/library/Cc392381.aspx


手元に英語環境が無いので、韓国語で実験。

'全角ハングル/半角ハングルでの、韓国語「頭(モリ)」
Dim wideHangul As String = ChrW(&HBA38) & ChrW(&HB9AC)
Dim halfHangul As String = ChrW(&HFFB1) & ChrW(&HFFC6) & ChrW(&HFFA9) & ChrW(&HFFDC)

'これだと、日本語環境では文字化けする
Dim halfWidth0 As String = StrConv(wideHangul, VbStrConv.Narrow)
Dim fullWidth0 As String = StrConv(halfHangul, VbStrConv.Wide)

'これなら OK
Dim lcid_Korea As Integer = 1042
Dim halfWidth1 As String = StrConv(wideHangul, VbStrConv.Narrow, lcid_Korea)
Dim fullWidth1 As String = StrConv(halfHangul, VbStrConv.Wide, lcid_Korea)



> StrConvを含めた箇所をすべて修正するには時間がかかると思いますので、
> それ以外にこの問題を回避する方法はありますでしょうか?

たとえば上記の韓国語の半角変換の場合、事前に
 My.Application.ChangeCulture("ko-KR")
として韓国のカルチャに変更しておけば、第三引数無しでも変換が成功します。
同様に、その英語環境で、"ja-JP" カルチャを指定した場合、結果に変化は無いでしょうか。

場合によっては、OS 側に MUI 言語パックを導入する必要があるかもしれません。
(MUI を導入可能な OS のエディションは限られていますが…)
引用返信 編集キー/
■76509 / inTopicNo.5)  Re[3]: 英語版OSでVBのStrConvを使用
□投稿者/ ヒークン (2回)-(2015/07/16(Thu) 15:26:09)
皆さまゴメンナサイ。
Windows 7の間違いでした。
StrConvの第3引数(ロケールID)については確認してみます。
(該当の端末が手元にないので、確認に時間がかかるかも知れません。)
引用返信 編集キー/
■76510 / inTopicNo.6)  Re[2]: 英語版OSでVBのStrConvを使用
□投稿者/ 魔界の仮面弁士 (410回)-(2015/07/16(Thu) 15:52:26)
No76506 (shu さん) に返信
> 既存のStrConvと同じインターフェースの同名関数を
> 定義してしまいます。
> その関数内で日本語環境ならそのまま
> 既存関数を呼ぶ(Microsoft.VisualBasic.StrConvを実行)

ちなみに、自作関数の中から本来の StrConv を呼ぶときは、
 Global.Microsoft.VisualBasic.Strings.StrConv
のように、名前空間まで含めて記述することになります。


それと、実行環境での互換モード設定も確認しておいた方が良いかもしれません。
EXE の互換モードを有効にしていると(特に XP 互換にしていた場合)に、
StrConv が誤動作する現象が報告されています。(VB6 でも VB.NET でも)
https://social.msdn.microsoft.com/Forums/ja-JP/cacc15a1-effd-4ef7-87c0-c9b0d5a39f9c/strconv?forum=vbgeneralja
http://hanatyan.sakura.ne.jp/patio/read.cgi?no=272


> そうでない環境なら同等の処理を行うようコードを作成します。
「同等の処理」の代案を幾つか紹介しておきます。

・LCMapString API の LCMAP_HALFWIDTH / LCMAP_FULLWIDTH
http://d.hatena.ne.jp/hilapon/20100916/1284623378
http://www.rinku.zaq.ne.jp/ultimate/tips/text/typ2.htm

・Visual Studio International Pack で変換ルールを定義
http://wiki.dobon.net/index.php?.NET%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%A6%B5%E6%2F85
https://www.microsoft.com/ja-jp/download/details.aspx?id=15251

・その他、自力実装
https://social.msdn.microsoft.com/Forums/ja-JP/c6521dac-6e99-4ab3-af24-b515b10f152c
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10448&forum=7



今回の件が、ロケールの明示指定だけで済むのであれば、それが一番手っ取り早そうですが、
もしも実行環境で日本語ロケールそのものがサポートされていなかった場合には、もしかしたら
上記に挙げた LCMapString(Ex) API も使えないという事態もありえそうです。

環境依存度が問題になるようであれば、自前で変換関数を実装した方が確実かも…。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -