UNICODEのファイルの読み込みを行っているのですが
CStringで1行ずつ取得していく方法をとっています。
そうすると必ず1行目の頭に ・ ←UNICODE判別の頭FFFEがついてしまいます。
読み込むときはこれを削除したいのですがなかなかうまくいきません(涙)
GetAtで ・ を取得することはできるのですがこれを IF など使って
制御文にいれて最初の ・だけ削除したいです。
どなたかわかる方がいらしたらよろしくご鞭撻の方よろしくお願いします。
ご鞭撻とゆーほどのことぢゃあーりませんが。(^^;
こーゆーことかな?
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);
}
Bunさんありがとうございます。さっそくやってみましたが
unsigned short' から 'unsigned char' に変換しました。
データが失われているかもしれませんと警告がでてしまいました(涙)
プログラム自体がユニコードで作成していますのでうまくいかなかったのかと思います。
う~ん難しいですね・・・。文字コードを0xFF FEで制御文にかけれればいいのですが。
CStringクラスの場合、キャラクタ単位の比較になると思います。
主要ソースをのせてみてわ?
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); ←ここで削除したいです
}
}
よろしくおねがいします
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);
}
これぢゃ、ダメでしょうか?
う~ん うまくいきません。
もしかしたら GetAt で取得してきてるものがちがうんでしょうか?
メッセージボックスで表示させると 文字化けして ・ で表示されるため
文字コードがわかりません。考えてみたらそもそも 0xfffeとゆう文字コードは
ないため違うものに変更されてるのかもしれません。プログラムの中では一時的に
使われるのかな(謎)
>メッセージボックスで表示させると 文字化けして ・ で表示されるため
>文字コードがわかりません。
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か否かわかります。
リリースでつくってるためブレイクができなくて(涙)
あとコンポーネントなので確かめに時間がかかっちゃって(涙)
↑のを試してみました。ありがとうございます。
でも半角カナでもひっかかってしまうため駄目でした。すみません。
文字コードの抽出を頑張ってみたいと思います。
FF FEが何故頭に付いているのかはわかっていますよね?
完全に読み込み処理と別扱いで処理すべきです。
あと,Unicodeを扱うなら,wchar_tで扱った方が楽です。
std::wstringとかstd::wfstreamとか……。
CStringは従来コードとUnicodeが混ざって使われる場合には向いていないです。
YuOさんありがとうございます。FF FEはUNICODEの判別としてついていますよね?
でも今回の処理だとどうしてもCStringに一度読み込ませてからとゆう処理をしなければならな
いのです。強引なとこもあるとおもいますが・・・すいません。
BUNさん
とりあえずやってみましたが結果 0xf8f3 とゆう値が求められましたが
これでためしてみても無理でした・・・(涙)
なんとかうまくいきました。
CStringで取得した場合 0xfffe ではなく 0xfeffで取得することがわかりました。
Bunさん YuOさん ありがとうございました。
またなにかわからないことがあったときはまたおねがいします。
>FF FEはUNICODEの判別としてついていますよね?
これは,UTF-16において,Little Endianで記録されていることを意味します。
最初の2 octetが0xFF, 0xFEの場合はLittle Endian, 0xFE 0xFFならBig Endianです。
16bit変数として見た場合に0xFEFFの場合はそのまま読めますが,
0xFFFEの場合は,バイト順を逆にする必要があります。