M1000まとめサイト

C++プログラムTips

最終更新:

匿名ユーザー

- view
管理者のみ編集可

char* → ディスクリプタ

諸事情があってchar*データを、Symbianのディスクリプタで扱いたい場合

char* c_str = "abcあいうM1234";    
// c_strを自前 SJIS-Unicode変換ライブラリにより変換(非公開スマソ)
// ↓変換結果
char unicode[] = {97, 0, 98, 0, 99, 0, 
                  66, 48, 68, 48, 70, 48,
                  77, 0, 49, 0, 50, 0, 51, 0, 52, 0,
                   0, 0}; 
TText* ttext = (TText*)unicode;
TPtrC tptrc(ttext);
label->SetTextL(tptrc);
//label->SetTextL(iOutputString->Des());

ドコモサンプル02_FontExのCFontExLabelPageのCreateLabelLのところを差し替えると、簡単に実行&確認できると思います。

参考サイト
http://forum.newlc.com/
charとかで検索すると、
how to convert char * to TDes
http://forum.newlc.com/index.php/topic,9902.0.html
などなどが引っかかります(同様の質問が多数)。


char* ← ディスクリプタ

調査中・・・
適当コード(鋭意改版中)
TPtrC tptrc; // どこからともなくでてきたTPtrC
char unicode[1024];
Mem::Copy(unicode, tptrc.Ptr(), tptrc.Length()*2);
unicode[tptrc.Length()*2] = 0;

補足
自前コード変換なんかよりも、↓とか使ったほうがいいとは思うんだけど・・・(調査中)。
 UIQ 2.1 SDK
  >> Developer Library
   >> API Reference
    >> C++ API reference
     >> Character Conversion


SJIS ⇔ Unicode

シフトジス⇔うにこーどの変換手順(注意:ここだけの話ですが、筆者は文字コードってあんまよくわかってません(瀧汗)。

  • 1.mmpファイルの編集
    • ライブラリ追加
LIBRARY charconv.lib

  • 2.makefile再構築
    • 私の環境は、VCなので、
abld makefile vc6

  • 3.ソースの編集
    • includeファイル追加、変換サンプル
#include <charconv.h>
CCnvCharacterSetConverter* converter=
 CCnvCharacterSetConverter::NewLC();
CCnvCharacterSetConverter::TAvailability ta = 
 converter->PrepareToConvertToOrFromL(
  KCharacterSetIdentifierShiftJis,
  CEikonEnv::Static()->FsSession());
if (ta != CCnvCharacterSetConverter::EAvailable)
  {
  return;
  }
TInt state=CCnvCharacterSetConverter::KStateDefault;

char* c_str = "M専ハァハァ";
TText8* ttext8 = (TText8*)c_str;
TPtrC8 tptrc8(ttext8);
TBuf8<128> sjisText(tptrc8);
TBuf<128> unicodeText;

TInt ctu=converter->ConvertToUnicode(unicodeText, sjisText, state);
if (ctu == CCnvCharacterSetConverter::EErrorIllFormedInput)
  {
  return;
  }
CleanupStack::PopAndDestroy(); //clean for converter
label->SetTextL(unicodeText);

ドコモサンプル02_FontExのCFontExLabelPageのCreateLabelLのところを差し替えると、簡単に実行&確認できると思います。

参考サイト(コピペ元)
How can convert Unicode to Iso88591?(with code)
http://forum.newlc.com/index.php/topic,2901.0.html


CのFILEによるファイルIO

やんごとなき事情があって、FILEを使わざるをえない場合

  • 1. mmpファイルの編集
    • include パス、ライブラリ追加
SYSTEMINCLUDE \epoc32\include
SYSTEMINCLUDE \epoc32\include\libc
LIBRARY estlib.lib

  • 2.makefile再構築
    • 私の環境は、VCなので、
abld makefile vc6

  • 3.ソースの編集
    • includeファイル追加、FILE使用例
#include <stdio.h>
#include <string.h>
// 入力・出力ファイルオープン
FILE* rf = fopen("C:\\m1000.txt", "r");	
FILE* wf = fopen("C:\\m1234.txt", "w");
// 入力・出力バッファ
char line[1024];
char wline[1024];
TInt n = 0;
while (fgets(line, 1024, rf) != NULL) //一行ずつ読み込み
  {
   // 適当に出力行を調整して
   sprintf(wline, "行[%04d][%04d]%s", ++n, strlen(line), line);
   // カキコ
   fputs(wline, wf);
   }
// クローズ
fclose(wf);
fclose(rf);

参考ドキュメント
 UIQ 2.1 SDK
  >> Developer Library
   >> API Reference
    >> C++ API reference
     >> C/POSIX Standard Library
 (たぶん、このリファレンスにある関数は使えるんじゃないかなぁ・・・)

 UIQ 2.1 SDK
  >> Developer Library
   >> Symbian OS Guide
    >> C++ API guide
     >> Base
      >> C Standard Library
 (ぜんぜん読んでないけど)

どこかのサンプルプログラムへコピペして、ブレークポイントとか
で動作を追ってみる(というほどのものではないけどね)といいかも。

もしかすると、Symbian流ファイル操作は↓なのかもしれません(苦笑)
 UIQ 2.1 SDK
  >> Developer Library
   >> Symbian OS Guide
    >> C++ API guide
     >> Base
      >> File Stores


  • おお、初のTipsだw自分もこの辺でまだ悩んでたところなんで助かります(T-T)自分ももっとがんばらねば… -- ま~ (2005-08-28 14:06:16)
  • でもコピペPGなんでこれでいいものか気になるところです。 -- 名無しさん (2005-08-30 00:04:02)
  • 後はファイルのIOさえわかれば簡易なアプリも作れるんですけどね… -- Ryu (2005-09-07 13:54:11)
  • てきとーにファイルIOを書いてみました -- 名無しさん (2005-09-08 00:17:33)
  • 日本人だと文字コードがうんたらかんたらと面倒だな -- 名無しさん (2005-09-21 15:46:42)
  • Symbianでファイル操作したければ、RFs, RFileといったクラスを使う必要があります。泣き所はfgetsのような改行を区切りに1行ずつ読むというのができないのが難点 -- ななし (2006-06-21 21:54:06)
  • 感謝します。SJIS変換できました。 -- 名無しさん (2007-10-15 21:58:37)
名前:
コメント:
ウィキ募集バナー