UNICODEファイルの読み込みで頭のFFFEの削除の仕方

[戻る]
まゆみ 2002/04/29(月) 10:52:33
UNICODEのファイルの読み込みを行っているのですが
CStringで1行ずつ取得していく方法をとっています。
そうすると必ず1行目の頭に "・" ←UNICODE判別の頭"FFFE"がついてしまいます。
読み込むときはこれを削除したいのですがなかなかうまくいきません(涙)
GetAtで "・" を取得することはできるのですがこれを IF など使って
制御文にいれて最初の "・"だけ削除したいです。
どなたかわかる方がいらしたらよろしくご鞭撻の方よろしくお願いします。

Bun 2002/04/29(月) 11:46:45
ご鞭撻とゆーほどのことぢゃあーりませんが。(^^;
こーゆーことかな?

CString str;

str = TCHAR(0xff);
str += TCHAR(0xfe);
str += _T("abcde");

unsigned char c;    
c = str.GetAt(0);

if (c == 0xff) {
 int len = str.GetLength();
 str = str.Mid(2, len - 2);
}

まゆみ 2002/04/29(月) 12:03:30
Bunさんありがとうございます。さっそくやってみましたが
"unsigned short' から 'unsigned char' に変換しました。
データが失われているかもしれません"と警告がでてしまいました(涙)
プログラム自体がユニコードで作成していますのでうまくいかなかったのかと思います。
う〜ん難しいですね・・・。文字コードを"0xFF FE"で制御文にかけれればいいのですが。

Bun 2002/04/29(月) 12:21:50
CStringクラスの場合、キャラクタ単位の比較になると思います。

主要ソースをのせてみてわ?

まゆみ 2002/04/29(月) 12:50:40
Bunさんのご指摘どおり主要ソースを公開します

    int        i;
    int     Uni;
    CString TEST;
    // 大きな項目数分ループをする
    for ( i = GetUpperBound(); i >= 0; i-- ) {
        // 左側のタブやスペースを削除
        CString        Wrk;
        Wrk = GetAt(i)[0];  ←ここで行単位で文字列取得
        Wrk.TrimLeft( _T(" \t") );
        TEST =Wrk.GetAt(0);  ←ここで行頭の文字を取得
                         (ここで"FF FE"を取得します)
        if(TEST==????){   ←ここで判別
                        Wrk.Delete(0);   ←ここで削除したいです
        }
           }
よろしくおねがいします

Bun 2002/04/29(月) 13:27:52
UNICODEの環境がつくれないので、試すことができません。m(__)m

TCHAR c;
CString str;

c = Wrk.GetAt(0);

if (c == (TCHAR)0xfffe) {
  int len = Wrk.GetLength();
  str = Wrk.Mid(1, len - 1);
}

これぢゃ、ダメでしょうか?

まゆみ 2002/04/29(月) 13:34:26
う〜ん うまくいきません。
もしかしたら GetAt で取得してきてるものがちがうんでしょうか?
メッセージボックスで表示させると 文字化けして "・" で表示されるため
文字コードがわかりません。考えてみたらそもそも "0xfffe"とゆう文字コードは
ないため違うものに変更されてるのかもしれません。プログラムの中では一時的に
使われるのかな(謎)

Bun 2002/04/29(月) 13:57:54
>メッセージボックスで表示させると 文字化けして "・" で表示されるため
>文字コードがわかりません。

TCHAR c;

c = Wrk.GetAt(0);

if ((signed short)c < 0) {
  int len = Wrk.GetLength();
  Wrk = Wrk.Mid(1, len - 1);
}

これもダメかなぁ?

ここでifのところにブレークポイントをもうけて止めて
ウォッチウィンドウで 変数 c の値を16進表示で見れば
0xfffeか否かわかります。

まゆみ 2002/04/29(月) 14:11:27
リリースでつくってるためブレイクができなくて(涙)
あとコンポーネントなので確かめに時間がかかっちゃって(涙)
↑のを試してみました。ありがとうございます。
でも半角カナでもひっかかってしまうため駄目でした。すみません。
文字コードの抽出を頑張ってみたいと思います。

YuO [E-Mail] 2002/04/29(月) 14:59:12
FF FEが何故頭に付いているのかはわかっていますよね?
完全に読み込み処理と別扱いで処理すべきです。

あと,Unicodeを扱うなら,wchar_tで扱った方が楽です。
std::wstringとかstd::wfstreamとか……。
CStringは従来コードとUnicodeが混ざって使われる場合には向いていないです。

まゆみ 2002/04/29(月) 15:11:16
YuOさんありがとうございます。FF FEはUNICODEの判別としてついていますよね?
でも今回の処理だとどうしてもCStringに一度読み込ませてからとゆう処理をしなければならな
いのです。強引なとこもあるとおもいますが・・・すいません。

BUNさん
とりあえずやってみましたが結果 "0xf8f3" とゆう値が求められましたが
これでためしてみても無理でした・・・(涙)

まゆみ 2002/04/29(月) 15:40:31
[[解決]]
なんとかうまくいきました。
CStringで取得した場合 "0xfffe" ではなく "0xfeff"で取得することがわかりました。
Bunさん YuOさん ありがとうございました。
またなにかわからないことがあったときはまたおねがいします。

YuO [E-Mail] 2002/04/29(月) 22:22:00
>FF FEはUNICODEの判別としてついていますよね?

これは,UTF-16において,Little Endianで記録されていることを意味します。
最初の2 octetが0xFF, 0xFEの場合はLittle Endian, 0xFE 0xFFならBig Endianです。

16bit変数として見た場合に0xFEFFの場合はそのまま読めますが,
0xFFFEの場合は,バイト順を逆にする必要があります。

古いスレッドには追加発言できません。