UNICODEを表示するには?

解決


ペットのPちゃん  2003-09-08 23:39:52  No: 79341

こんにちは。
VBの標準コントロール(テキストボックスやリストボックス)に
UNICODE文字を表示するには、どのようにすればよいのでしょうか。

現在は、簡単な例として
テキストボックス1に文字列を入力し、ボタンを押下すると
テキストボックス2にUNICODE文字列を表示したいと考え、
ボタン押下字にテキストボックス1の文字列をStrConvでUNICODE変換させて
います。
それを単純にテキストボックス2へセットしていますが「???」で出力されます。
また、ラベルコントロールに変換前バイト数(LenB)とStrConv後のバイト数をとると
同じ値が表示されてしまいます。
このUNICODE変換というのは、Windowsのネイティブコード(UCS2)に変換してるだけと
考えてよいのでしょうか?
ご教授お願いします。


魔界の仮面弁士  2003-09-08 23:59:27  No: 79342

> VBの標準コントロール(テキストボックスやリストボックス)に
> UNICODE文字を表示するには、どのようにすればよいのでしょうか。

残念ながら、VBの標準コントロールはUnicodeに対応していません。
APIで、Unicodeウィンドウを生成して、それを利用するか、
もしくは、Unicode対応コントロールで代用してください。

なお、Unicodeに対応したコントロールの話題に関しては、
このサイトの「Visual Basic Q & A 掲示板」および
「Visual Basic 初心者掲示板」にて、何度か回答していますので、
過去ログを検索してみてください。


ペットのPちゃん  2003-09-09 00:22:58  No: 79343

魔界の仮面弁士さん、アドバイスありがとうございます。
今までVC++派でしたので、まだVBの根本的考え方がわかっていないところもありました。
基本的にVB5以上はデフォルトの文字コードはUNICODEだったんですね(^^;
今調べてわかりました。
ということは、内部的な文字列処理ではStrConvをかます必要はない(二重変換)のか
と認識しましたが間違っているでしょうか?
あとは、標準コントロールにどう表示するかを過去ログで調べてみます。
また、UNICODEに関して指摘やアドバイスのほど宜しくお願いします。

※ちなみに環境は、Oracle9i キャラクターセットがUTF8
外字を扱っているため、VBアプリ上での表示もUNICODE対応しないと厳しいんです。


ペットのPちゃん  2003-09-09 00:53:46  No: 79344

過去ログで「特殊な文字を表示するには 」とありました。
まさしく、内容的にはこれに該当します。

結論から、標準コントロールでのUNICODE表示はできないということがわかりました。
魔界の仮面弁士さんがおっしゃる通り、Unicodeウィンドウを自力で生成するしか
ないのかと思いました(T_T;
何かとVBは難しい…、VC++なら簡単にUNICODE対応ができたのに。。。

ところで、ちょっと本題からはずれてしまうのですが、
以前、C++で作成したDLL内でUNICODE変換(SJISからUTF8やUTF16等)のロジックが
あるのですが、そのロジックをVB内で使用してみようと試みたことがありました。(DECLARE文にて)
DLLは読み込めているものの、DLL内の指定関数の読込みに失敗しているようなんです。
原因は何となく見当はついているものの対応策が…。
VBからSHIFTJIS文字列を渡し、UTF8やUTF16に変換した文字列を返しているのですが、
C++側の関数戻り型をwchar_t*型にしています。たぶんここが問題かと思われるのですが、詳しい方がいましたらこちらもアドバイスお願いします。


魔界の仮面弁士  2003-09-09 01:14:23  No: 79345

表示だけで良ければ、TextOutのWide系エントリで出力すれば、
Unicode文字を、描画する事ができます。

編集が必要ならば、Unicode対応コントロールを使ってください。

# 以前、DataGridを使ってUnicode文字列を表示するサンプルや、
# WebBrowserを利用したUnicode対応テキストボックスのサンプルを
# 書いた事があります。興味があれば、過去ログで探して見てください。

> DLL内の指定関数の読込みに失敗しているようなんです。
どのようなコードを書いていて、どのようなエラーになるのかなどが
わからなければ、回答できませんよ…。(^^;

多分、Declare宣言に問題があるか、VBからの呼び出し方に問題があるのでしょう。

> C++側の関数戻り型をwchar_t*型にしています。
引数ではなく、戻り値で返しているのですか…? だとすると、
メモリの確保と解放の問題もあるので、少々厄介かも知れません。

試していませんが、戻り値を As Longで受けて、そのポインタにあるデータを
lstrcpy API等で文字列変数に複写する形になるのではないでしょうか。


魔界の仮面弁士  2003-09-09 01:20:35  No: 79346

> 何かとVBは難しい…、VC++なら簡単にUNICODE対応ができたのに。。。

VB6だと面倒ですが、VB.NETならば Unicodeがそのまま使えますよ。(^-^A


ペットのPちゃん  2003-09-09 01:38:20  No: 79347

魔界の仮面弁士さん、いろいろとアドバイスありがとうございます。

>表示だけで良ければ、TextOutのWide系エントリで出力すれば、
>Unicode文字を、描画する事ができます。
今のところ(というより今後も)エンドユーザからのUNICODE入力はさせない方向
なので、表示だけできれば十分です。
TextOutWですか、試してみます。

DLLの件ですが、
>どのようなコードを書いていて、どのようなエラーになるのかなどが
>わからなければ、回答できませんよ…。(^^;

ですよね(^^;
エラー内容を書こうと思った(書くべき)なのですが、試作中に却下してしまい
このソースもろもろ削除してしまったので再実行不可です…。
(サクっと作れるレベルのものですがねー)
覚えている範囲では、確か…

<VB側:定義部>
DECLARE FUNCTION UTF8Cnv LIB "ACnv.dll" (ByVal str As String) As Byte

<VB側:実装部>
Dim wstr As Byte
wstr = UTF8Cnv(Text1.Text);

<DLL内ソース>
__declspec(dllexport) wchar_t* UTF8Cnv(char *sjis)
{
    wchar_t*  pwstr;

    …変換処理…

    return pwstr;    
}

<エラー内容>
確か…UTF8Cnv関数が、ACnv.dll内に見つからないとか何とか言ってた記憶あり。

以前はVC++版でUNICODE系の処理を組み込んでいたので、それが流用できるかな
と安易に考えていましたが、つくりが戻り値ありなので、やはりVBからのCALLでは手間が
かかりそうなんですね。


魔界の仮面弁士  2003-09-09 02:01:39  No: 79348

> DECLARE FUNCTION UTF8Cnv LIB "ACnv.dll" (ByVal str As String) As Byte
DLL側はwchar_tのポインタなので、この場合は As Long で受ける事になる気がします。

> 確か…UTF8Cnv関数が、ACnv.dll内に見つからないとか何とか言ってた記憶あり。
おそらく、ACnv.dll に "UTF8Cnv" というエントリが無いのだと思います。

SDKツールの Dependency WalkerかDUMPBINを使って、DLL側が、
別のエントリ名(例えば、"_UTF8Cnv@4"など)で公開されていないかを
確認してみてください。
また、DLL側プロジェクトのdefファイルの指定も確認してみてください。

> 以前はVC++版でUNICODE系の処理を組み込んでいたので、それが流用できるかな
> と安易に考えていましたが、つくりが戻り値ありなので、やはりVBからのCALLでは手間が
> かかりそうなんですね。
VBから呼びやすいように、結果をBSTR型で返すようなラッパーDLLを作り、
元のDLLは、そのラッパーから内部的に呼び出すようにするとか。


ペットのPちゃん  2003-09-09 02:01:41  No: 79349

VB.NETですか…。
.NET系には無関心な会社だからなぁ(^^;;


ペットのPちゃん  2003-09-09 02:21:38  No: 79350

魔界の仮面弁士さん、いろいろありがとうございます。

これ以上の内容(DLLに関する)は、本題とは別件にてレスを立てますね。
結論として、UNICODEの表示のみならばTextOutWにて対応可能ということで、
まずは検証してみます。
UNICODE表示については解決策が見つかったということで幕を閉じます。
しばらく技術から離れると大変だー。
ENDユーザーとの打ち合わせ、設計、でもう忘れそー。

※DLLの方も再度検証してみます。
今回のアドバイスで、結構良い方向になる気がします(^^
今後も引き続き、アドバイスいただけますよう宜しくお願いします。

※自分もアドバイスできるぐらいにならなければ…いつになることやら…。


ペットのPちゃん  2003-09-09 02:22:12  No: 79351

チェック忘れ。。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加