人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【Visual C# 2008】プログラム内で作成した文字列AをDLLに渡す処理を作りたいと思います。
DLLには、文字列と共に文字列Aのバイト数を渡さないといけないのですが、
プログラム内の文字コードがEUCかUTF-8かshift jisか解らないことから
バイト数を調べることができません。バイト数を調べる方法について
アドバイスいただきたく宜しくお願いします。

<文字列A>
String strData=”試験用文字列” //文字列は日本語、英語混合です。


●質問者: harunoharuno
●カテゴリ:コンピュータ インターネット
✍キーワード:C# DLL EUC JIS String
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ymlab
●120ポイント

文字列のバイト数が文字コードが不明のため、わからないとのことですが、

なんとなく、内部的には統一されていそうな気もします。

[PHPで言うところのInternal Encode とかないのかなぁ]と。

とにかく、最初にその文字列Aがどの文字コードを調べる必要がありそうですね。

http://www.geocities.jp/gakaibon/tips/csharp2008/charset-check.h...

に詳しい説明があり、さらに一番したのリンクをたどると、

http://www.geocities.jp/gakaibon/tips/csharp2008/charset-check-s...

サンプルコードがありました。

私の中で有名なサイトでは、

http://dobon.net/vb/dotnet/string/detectcode.html

ここもありました。

文字コードが分かれば、

http://itnandemolab.blog70.fc2.com/blog-entry-1074.html

などの方法で、バイト数を取得できれば、よいと思います。

個人的には、DLLに渡す前に文字コードをSJISでも良いし、Unicodeでも良いですが、その用途に応じて、何かに統一して渡した方が安全な気もします。

◎質問者からの返答

回答ありがとうございます。

テスト用のDLLを作成し、

受け取った値を判定すれば文字コードは解りそうですね。


2 ● lkaitol
●120ポイント

.Netですよね?

.Netなら、標準の文字コードはUNICODEなので、

UNICODE専用で関数を作ればいいのではないでしょうか?

SJISやEUCも使いたければ、それ専用の関数を用意するべきだと思います。

ちなみに、WinAPIの場合もUNICODE版とANSI版の二種類の関数が定義されていて、Defineによって呼び出す関数を振り分ける仕様になっています。

http://dummy

◎質問者からの返答

回答ありがとうございます。

>>標準の文字コードはUNICODE

ありがとうございます。探しても見つからなかったので参考になる記事とか張っていただけると助かります。

>>UNICODE専用で関数を作ればいいのではないでしょうか?

DLLはソースなしのブラックボックスのものです。


3 ● ymlab
●120ポイント ベストアンサー

再回答失礼いたします。

内部エンコードは、

MSDNの

http://msdn.microsoft.com/ja-jp/library/cc488003.aspx

に書いてある通り、UTF-16で統一されているようです。

従って、DLLに渡すときは自動的に変換処理をして、UTF-16になっているということですね。

ただ、id:lkaitol さんの回答に対する返事のメッセージで気になったのですが、

>DLLはソースなしのブラックボックスのものです。

という文言です。

そのDLLは、いつの時代のどの言語で開発されたDLLなのでしょうか。


Visual Studio 2005 から、漢字コードが、マルチバイトから、Unicodeに変わっています。

.NET時代の場合utf-8 ですので、併用できるかとは思いますが、

http://www.atmarkit.co.jp/fxml/askxmlexpert/024utf/24utf.html

それ以前は、マルチバイトが主体となっています。

この差を吸収するために、Dllのプログラムの方で実装されていたらよいのですが。

http://jehupc.exblog.jp/9620592/

一度マルチバイト、Unicodeのそれぞれで返り値がどのようになるのかを、

確かめられてから実装されたほうがよいかと思います。

また、そのDllがC#で作成されたのではなく、C++で作成されているのであれば、

定義からして違うので、unsafe モードで、マーシャリングをしないといけないかと思います。

◎質問者からの返答

知恵をありがとうございます。

Unsafeモードとかマーシャリングとか意識していませんでした。

>>一度マルチバイト、Unicodeのそれぞれで返り値がどのようになるのかを、

>>確かめられてから実装されたほうがよいかと思います。

そうですね。それぞれの返り値は見ないといけないですね。


4 ● lkaitol
●120ポイント

http://wisdom.sakura.ne.jp/programming/cs/cs4.html

string | Unicode キャラクタの文字列への参照

と、ここにも書いてあります。

あと、ブラックボックスなDLLでも、

.netでは、マーシャリングというものが働き、自動的に変換されます。

http://wisdom.sakura.ne.jp/programming/cs/cs65.html

ここに書いてあるので、見本にどうぞ。

◎質問者からの返答

回答ありがとうございます。

.Netはマネージコード(中間言語のようなもの?)と聞いていますが

当然、ネイティブコードに変換する処理があるのですね。

勉強になりました。本質門は、8/18に終了します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ