【Visual C# 2008】プログラム内で作成した文字列AをDLLに渡す処理を作りたいと思います。

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

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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2010/08/18 11:10:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ymlab No.3

回答回数508ベストアンサー獲得回数34

ポイント120pt

再回答失礼いたします。

内部エンコードは、

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 モードで、マーシャリングをしないといけないかと思います。

id:harunoharuno

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

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

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

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

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

2010/08/17 13:58:29

その他の回答3件)

id:ymlab No.1

回答回数508ベストアンサー獲得回数34

ポイント120pt

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

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

[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でも良いですが、その用途に応じて、何かに統一して渡した方が安全な気もします。

id:harunoharuno

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

テスト用のDLLを作成し、

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

2010/08/13 19:33:03
id:lkaitol No.2

回答回数16ベストアンサー獲得回数0

ポイント120pt

.Netですよね?

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

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

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

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

http://dummy

id:harunoharuno

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

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

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

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

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

2010/08/13 19:37:17
id:ymlab No.3

回答回数508ベストアンサー獲得回数34ここでベストアンサー

ポイント120pt

再回答失礼いたします。

内部エンコードは、

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 モードで、マーシャリングをしないといけないかと思います。

id:harunoharuno

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

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

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

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

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

2010/08/17 13:58:29
id:lkaitol No.4

回答回数16ベストアンサー獲得回数0

ポイント120pt

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

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

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

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

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

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

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

id:harunoharuno

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

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

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

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

2010/08/17 14:06:52

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません