DLLには、文字列と共に文字列Aのバイト数を渡さないといけないのですが、
プログラム内の文字コードがEUCかUTF-8かshift jisか解らないことから
バイト数を調べることができません。バイト数を調べる方法について
アドバイスいただきたく宜しくお願いします。
<文字列A>
String strData=”試験用文字列” //文字列は日本語、英語混合です。
再回答失礼いたします。
内部エンコードは、
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 モードで、マーシャリングをしないといけないかと思います。
文字列のバイト数が文字コードが不明のため、わからないとのことですが、
なんとなく、内部的には統一されていそうな気もします。
[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を作成し、
受け取った値を判定すれば文字コードは解りそうですね。
.Netですよね?
.Netなら、標準の文字コードはUNICODEなので、
UNICODE専用で関数を作ればいいのではないでしょうか?
SJISやEUCも使いたければ、それ専用の関数を用意するべきだと思います。
ちなみに、WinAPIの場合もUNICODE版とANSI版の二種類の関数が定義されていて、Defineによって呼び出す関数を振り分ける仕様になっています。
回答ありがとうございます。
>>標準の文字コードはUNICODE
ありがとうございます。探しても見つからなかったので参考になる記事とか張っていただけると助かります。
>>UNICODE専用で関数を作ればいいのではないでしょうか?
DLLはソースなしのブラックボックスのものです。
再回答失礼いたします。
内部エンコードは、
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のそれぞれで返り値がどのようになるのかを、
>>確かめられてから実装されたほうがよいかと思います。
そうですね。それぞれの返り値は見ないといけないですね。
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に終了します。
知恵をありがとうございます。
Unsafeモードとかマーシャリングとか意識していませんでした。
>>一度マルチバイト、Unicodeのそれぞれで返り値がどのようになるのかを、
>>確かめられてから実装されたほうがよいかと思います。
そうですね。それぞれの返り値は見ないといけないですね。