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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

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

#1

投稿記事 by dic » 13年前

テキストの処理をしているのですが文字の処理がうまく動作しないです
テキストにはディレクトリと始まり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

アバター
ゆーずぃ
記事: 62
登録日時: 13年前
住所: 埼玉県

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

#2

投稿記事 by ゆーずぃ » 13年前

日本語の部分のみということで、表示の為に取り出しているバイト数が足りないのではないでしょうか?
英数字は1バイトで一文字ですが、日本語は2バイトで一文字です。出力方法がわかりませんが、2バイトずつの表示にしてみてはどうでしょう?

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

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

#3

投稿記事 by dic » 13年前

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

アバター
toyo
記事: 35
登録日時: 13年前
住所: 宮崎県

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

#4

投稿記事 by toyo » 13年前

エディタの文字コードと表示コンソールの文字コードが違うのではないでしょうか
OS、表示手段はどうなっていますか
VisualC++とコマンドプロンプトでは問題ありませんでした
添付ファイル
無題.jpg

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

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

#5

投稿記事 by dic » 13年前

お返事ありがとうございます

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) 閲覧数: 3854 回
無題.JPG
無題.JPG (29.97 KiB) 閲覧数: 3854 回

アバター
Justy
副管理人
記事: 122
登録日時: 13年前
住所: 神奈川県

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

#6

投稿記事 by Justy » 13年前

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

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

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

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#7

投稿記事 by ISLe » 13年前

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

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

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

#8

投稿記事 by dic » 13年前

すいません Shift-JISでした
JISとひとくくりにうる覚えしてました

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

変換するなどして対応します
ありがとうございました
添付ファイル
無題.JPG
無題.JPG (8.81 KiB) 閲覧数: 3796 回

閉鎖

“C言語何でも質問掲示板” へ戻る