ページ 11

文字列処理がうまくいかない

Posted: 2010年12月02日(木) 20:32
by dic
テキストの処理をしているのですが文字の処理がうまく動作しないです
テキストにはディレクトリと始まりhttp://とURLがランダムに続き
またディレクトリ,http://...となってます
ここで、ディレクトリとURLの判定は一文字目を見て 'h' でないならディレクトリ
もしそうなら URL と判定しています

そして、ログを出力してみたのですが、きちんと日本語として認識されてますし
元のデータもJISコードで文字コード関連の問題ではないと思っているのです

現在
ディレクトリ
http://www.google.co.jp?=hoge
http://www.google.co.jp?=hoge1
http://www.google.co.jp?=hoge2
http://www.google.co.jp?=hoge3
http://www.google.co.jp?=hoge4
ディレクトリ
http://www.google.co.jp?=hoge5
http://www.google.co.jp?=hoge6
http://www.google.co.jp?=hoge7
http://www.google.co.jp?=hoge8

となっているvector<string> から1要素とりだしています
しかし、日本語のディレクトリの部分のみ文字化けしてしまいます
どういった原因が考えられるでしょうか?

環境:VisualC++ 6
OS:WIndowsXP

Re: 文字列処理がうまくいかない

Posted: 2010年12月02日(木) 23:51
by ゆーずぃ
日本語の部分のみということで、表示の為に取り出しているバイト数が足りないのではないでしょうか?
英数字は1バイトで一文字ですが、日本語は2バイトで一文字です。出力方法がわかりませんが、2バイトずつの表示にしてみてはどうでしょう?

Re: 文字列処理がうまくいかない

Posted: 2010年12月03日(金) 17:55
by dic
vector<string> v に格納するソースです
メモリ関連はSTLにまかせているので問題ありませんし、
char http[1024]; も十分なほど容量があり、これが容量不足とは考えにくい状態です
日本語のみとりだすときに文字化けするのです
UNICODE も指定してないので問題なく取り出せると思っているのですが、そうではないようです
そのほかに原因は考えれるものはないでしょうか?

コード:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    vector<string>	v;
	char	http[1024];
	int	i;

	//	v を初期化
	for( i=0; i<1000; i++ )
	{
		memset( http, 0, sizeof(http) );
		sprintf( http, "http://www.google.co.jp/search=日本語&%d\n", i );
		v.push_back( http );
	}

	//	ファイルに出力
	FILE	*file = fopen( "debug.txt", "wt" );
	for( i=0; i<v.size(); i++ )
	{
		memset( http, 0, sizeof(http) );
		strcpy( http, v.at(i).c_str() );
		fputs( http, file );
	}

	//	とりだす
	//	ここの取り出すときに日本語が化けている
	char	temp[1024];
	for( i=0; i<v.size(); i++ )
	{
		memset( temp, 0, sizeof(temp) );
		strcpy( temp, v.at(i).c_str() );
		//	表示
		printf( "%s", temp );
	}
	return 0;
}

Re: 文字列処理がうまくいかない

Posted: 2010年12月03日(金) 18:40
by toyo
エディタの文字コードと表示コンソールの文字コードが違うのではないでしょうか
OS、表示手段はどうなっていますか
VisualC++とコマンドプロンプトでは問題ありませんでした

Re: 文字列処理がうまくいかない

Posted: 2010年12月03日(金) 21:53
by dic
お返事ありがとうございます

WIndowsXP Home Editoin のメモ帳でEUCコードのソースを見たのですが
文字化けするのでJISコードの文字しか対応していないと推測できるのです
なので、メモ帳で開いた ディレクトリ という文字列はJISコードだと思うのです

それで、特に文字コードに関するトラブルはないと思っています

そこで、vector<string> v に格納された文字列を取り出すときに
文字化けを起こすので原因が不明なのです
文字化けした文字列でディレクトリは画像のように無理やり作成できてます
また、それに関連付けしている http://... の処理もうまくいっています

表示するコンソールも、メモ帳でもJISコードで どちらとも同じ文字コードを使用していてて

コード:

vector<string> v; // vは初期化済み ディレクトリ+http://+http://....
int i;
for( i=0; i<v.size(); i++ )
{
 memset( temp, 0, sizeof(temp) );
 strcpy( temp, v.at(i).c_str() );
}
のとりだす部分のみがうまく日本語がとりだせないです

もうすこし、vector<string> v の初期化部分などをじっくり見たいと思います
無題.JPG
無題.JPG (29.97 KiB) 閲覧数: 5264 回
無題.JPG
無題.JPG (29.97 KiB) 閲覧数: 5264 回

Re: 文字列処理がうまくいかない

Posted: 2010年12月03日(金) 23:08
by Justy
 見る限り文字コードの問題に見えますよ。
 その化け方からすると UTF-8を SJISに無理矢理変換したときのような。
 ソースコードが UTF-8になっていませんか?(VC6はUTF-8のソースコードは扱えなかったような記憶が)

 もし判らなければソースコードと出力結果(debug.txt)を zipで固めてアップしてもらった方がいいかもしれません。

メモ帳でもJISコードで
 SJISではなくJISですか。
 どうやってJISであることを確認しました?

Re: 文字列処理がうまくいかない

Posted: 2010年12月03日(金) 23:55
by ISLe
dic さんが書きました:WIndowsXP Home Editoin のメモ帳でEUCコードのソースを見たのですが
文字化けするのでJISコードの文字しか対応していないと推測できるのです
JISでなくてSJISですね。
あとメモ帳はUTF-16、UTF-8にも対応していますよ。
ユニコードに対応したのはXP以降だったかな。

Re: 文字列処理がうまくいかない

Posted: 2010年12月04日(土) 10:26
by dic
すいません Shift-JISでした
JISとひとくくりにうる覚えしてました

UTF16 UTF8 に対応していない VC++6で開いたところ文字化けしていました
WindowsXPのメモ帳が対応していないと誤認していました(Windows98では対応してなかったので、あまり期待してなかったです)
なので、WindowsXPのメモ帳で開ける=Shift-JISである UTF-16 UTF-8ではない
と考えてしまっていました

変換するなどして対応します
ありがとうございました