VC++6.0で作成したアプリケーションのエディットボックスに
Unicodeでしか表現できない文字を入力することは可能でしょうか。
やりたいことは、VC++6.0で作成したアプリケーションをVistaで
動作させて、そこで1文字が3,4バイトになるような文字を入力できるように考えています。
実際にエディットボックスに入力すると?になってしまいます。
XPでも、IMEのモードを一般から人名/地名に変更して、かもめ(鴎の左側のメが品のやつ)
を入力すると再現できました。
現象自体は、Shift_jisで表せない文字を入力して、表示できないからだと思いますが
これは回避可能でしょうか?
よろしくお願いします。
自信はありませんが、オーナードローでUnicode変換してから表示すれば
解決するかもしれません。
プリプロセッサでUNICODEと_UNICODEを定義して再コンパイルすればよいのでは?
対応可能なようにコードが書かれていて,かつI/Oまわりも処理可能なことが前提です
が。
Shift_JisとUnicodeの文字を混ぜて表示する事は出来ませんから
YuOさんが言われているようにプリプロセッサで切り替えてしまうのが
一番手っ取り早いでしょうね。
但し、TCHARとか_T()を使わずにコーディングしている場合は
その辺周りを修正しないと駄目でしょうけれど。
ご返信ありがとうございます。
mfc42ud.libを追加インストールしないといけないんですね。
ちょっとすぐ試せないですけど、おってご報告します。
ところで、TCHARとか使ってないです。大量にchar使ってます。やはり書き直さないとダ
メですよね。
CStringってUnicode、OKでしょうか。
VSのCDがまだ手配できなくて(ライセンスはもちろんあります)
Unicodeのテストできてないのですが
TCHARを使用して、charをwchar_t(2バイト)に置き換えたとして
Vista等で入力可能になるUnicodeの3,4バイト文字は結局、使用できないのでしょうか。
>CStringってUnicode、OKでしょうか。
これ、自分で調べました。CStringは、内部でTCHARを使用しているからOKなんですね。
実際にもっと簡単なサンプルをつくって試してみてはどうでしょうか?
今あるのを書き換えても結局使えなかったら無駄になる可能性もありますし。
> Unicodeの3,4バイト文字
UTF-16だとすると、3バイト文字なんてあるんですかね。
1コード2バイトなのでサロゲートペアでも2バイト×2コードで4バイト
にはなると思いますけど。
おそらく、サロゲートペアの場合wchar_t型の領域2個分をつかって1文字をあらわす
ように文字コードが格納されるんじゃないでしょうかね。
(Shift_JISコードで全角文字が2バイト使うのと同じ様に)
ありがとうございます。
>おそらく、サロゲートペアの場合wchar_t型の領域2個分をつかって1文字をあらわす
>ように文字コードが格納されるんじゃないでしょうかね。
あ、そういうことですか。
VSのCDが手配次第、サンプルを作って試してみます。
VC++6.0でUNICODEを扱うアプリ作ったことあります
フルソースあります
もしまだ未解決のときはおっしゃってください
皆さん言われているように
プリプロセッサの_MBCSを消して_UNICODEとUNICODEを追加すれば可能ですよ
NT4用アプリだってVC5やVC6の時代に作られてたわけですし
とーりすがりさんの書き込みに補足です。
MSDN Libraryの「Unicode プログラミングの要約」
<< http://msdn.microsoft.com/library/ja/default.asp?
url=/library/ja/vccore/html/_core_unicode_programming_summary.asp>>
に記載されていますが、exeを作成する場合は、
エントリポイントしてwWinMainCRTStartupを追加する必要があります。
#最近ちょうどVC6.0でUnicodeプログラミングの作成をしているので。。。
どうにもたけさんが言ってるUnicodeはよく使われるUnicodeより拡張(本来?)の
もののように思うのですが、どうなんでしょうか。
http://msdn.microsoft.com/library/ja/vccore/html/
_core_support_for_unicode.asp
だと、基本2バイトで、サロゲート使用時に4バイトとの事です。
そして、2バイトの型なので結局3バイトにならず4バイトになってしまいます。
http://euc.jp/i18n/charcode.ja.html
でUCS(Unicode)の項を見てみると、やはり2か4バイトです。
UTFだと3バイトなどもあるようですが…。
色々呼び方、実装の正確性などバラつきが有るようです。
http://itpro.nikkeibp.co.jp/article/NEWS/20060516/238066/
そして、Vistaで実装されるのはこちらではないでしょうか。
この記事世読む分にはUnicodeのバージョンアップのようですが、どうなんでしょう
か。
UTF-16なのかUTF-8なのかで話は変わってきますね。
この辺はWEBじょうで調べれば、ごろごろ出てくると思います。
この辺はUnicodeと一口に言っても幾つか種類がありますので
きちんと調べた方が良いと思いますよ。
今までのWindows環境では基本的にUnicodeと言えば、
UTF-16を指していましたので、これを使うのであれば、
WCHARで取り扱う必要があります。
TCHARは_UNICODEの定義の有無でcharとWCHARを自動で切り替えて
くれる便利な物なのでUnicode対応を考えるのであれば、
最初からTCHARを使うようにしておいたほうが楽が出来ます。
文字列のリテラルも_T(あああ)と言うのようにしておくと
同様の効果を期待できます。
基本的にVC++6.0で期待できるUnicode処理はUTF-16ですので
_UNICODEで対応できる範囲であれば、UTF-16と言う事なのでは
ないでしょうか?
あと、Vistaのフォントの問題とUnicodeの話は別物ですので
一緒くたにしない方が良いと思います。
Vistaのフォントの問題はJIS2004への対応により、
特定のコードの文字の形が変わってしまっている事に起因して
いるのであって、Unicodeが云々と言う話ではないはずです。
試せてないうちに、みなさんコメントありがとうございます。
>どうせなら、らららさんのトピックを載せておきましょう。
> http://rararahp.cool.ne.jp/vc/vctips/unicode.htm
やろうとしていたことは上記で、サンプルを作成したところ出来ました。
他にもstrcpyを_tcscpyに変更するなどやることは多そうですが大丈夫そうです。
ただ、サロゲートペアの文字についてはXP上では試せてないです。
(XP上では不可?)
Vista上でまた試してみます。