UNICODEファイルの読み込みで頭のFFFEの削除の仕方 – プログラミング – Home

UNICODEファイルの読み込みで頭の...
 
通知
すべてクリア

[解決済] UNICODEファイルの読み込みで頭のFFFEの削除の仕方


まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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


引用未解決
トピックタグ
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

ご鞭撻とゆーほどのことぢゃあーりませんが。(^^;
こーゆーことかな?

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);
}


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

CStringクラスの場合、キャラクタ単位の比較になると思います。

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


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

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);
}

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


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

>メッセージボックスで表示させると 文字化けして ・ で表示されるため
>文字コードがわかりません。

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か否かわかります。


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

FF FEが何故頭に付いているのかはわかっていますよね?
完全に読み込み処理と別扱いで処理すべきです。

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


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

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

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


返信引用
まゆみ
 まゆみ
(@まゆみ)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

なんとかうまくいきました。
CStringで取得した場合 0xfffe ではなく 0xfeffで取得することがわかりました。
Bunさん YuOさん ありがとうございました。
またなにかわからないことがあったときはまたおねがいします。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

>FF FEはUNICODEの判別としてついていますよね?

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました