C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: コマンドライン引数を使った場合の文字化け


(過去ログ 114 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■67643 / inTopicNo.1)  コマンドライン引数を使った場合の文字化け
  
□投稿者/ OROCHI (5回)-(2013/08/20(Tue) 14:03:31)

分類:[C/C++] 

OS:Windows 8
開発環境:Visual Studio 2010


こんにちは。現在以下のようにコマンドライン引数を拾って表示するようなプログラムを作ったのですが、コマンドラインから実行すると文字化けするという現象が発生します

コード
#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	if(argc < 2)
	{
		std::cout << "Hi! why not pass me argumets?\n";
	}
	else
	{
		for(int k=1; k != argc; ++k)
		{
			std::cout << "Hello, " << argv[k] << "!\n";
		}
	}
		
	return 0;
}

コマンドラインからの入力例
>(exeファイル名) madoka

出力結果
Hello, 00C81186!

一応文字列が同じであれば化ける内容も同じなので、内部での処理の問題だと思うのですが、お心当たりのある方いらっしゃいますでしょうか?

引用返信 編集キー/
■67644 / inTopicNo.2)  Re[1]: コマンドライン引数を使った場合の文字化け
□投稿者/ Hongliang (84回)-(2013/08/20(Tue) 14:14:26)
argv[]は_TCHAR*であり、Unicode文字セットでコンパイルした(最近のVSの既定値)場合はwchar_t*です。
std::coutはwchar_t*を文字列としては扱えません。
http://www.kijineko.co.jp/tech/cppsamples/stdout.html
char*に変換するなり(ANSIで扱えない文字が存在します)、std::wcoutを使うなり、WriteConsoleなどのWin32APIを使うなり、マルチバイト文字セットでコンパイルするなりする必要があります。
引用返信 編集キー/
■67649 / inTopicNo.3)  Re[2]: コマンドライン引数を使った場合の文字化け
□投稿者/ επιστημη (79回)-(2013/08/20(Tue) 20:54:20)
επιστημη さんの Web サイト
> char*に変換するなり(ANSIで扱えない文字が存在します)、std::wcoutを使うなり、WriteConsoleなどのWin32APIを使うなり、マルチバイト文字セットでコンパイルするなりする必要があります。

std::wcoutだとこんなんで。

#include "stdafx.h"
#include <iostream>
#include <locale>

int _tmain(int argc, _TCHAR* argv[])
{
#ifdef UNICODE
  std::wcout.imbue(std::locale("japanese"));
  if(argc < 2) {
    std::wcout << L"Hi! why not pass me argumets?\n";
  } else {
    for(int k=1; k != argc; ++k) {
      std::wcout << L"Hello, " << argv[k] << L"!\n";
    }
  }
#else
  if(argc < 2) {
    std::cout << "Hi! why not pass me argumets?\n";  
  } else {
    for(int k=1; k != argc; ++k) {
      std::cout << "Hello, " << argv[k] << "!\n";
    }
  }
#endif		
  return 0;
}

引用返信 編集キー/
■67654 / inTopicNo.4)  Re[3]: コマンドライン引数を使った場合の文字化け
□投稿者/ とっちゃん (137回)-(2013/08/21(Wed) 10:42:10)
とっちゃん さんの Web サイト
No67649 (επιστημη さん) に返信

ANSI/UNICODE をコンパイルオプションに全面的にお任せするようなコードも。

//// stdafx.h の最後に追加

#include <tchar.h> // 既に定義があるはず...

#ifdef _UNICODE
#define tcout wcout
#else
#define tcout cout
#endif

//////

#include "stdafx.h"
#include <iostream>
#include <locale>

int _tmain(int argc, _TCHAR* argv[])
{
  std::tcout.imbue( std::locale( "japanese" ) );
  if(argc < 2)
  {
    std::tcout << _T("Hi! why not pass me argumets?") << std::endl;
  }
  else
  {
    for(int k=1; k != argc; ++k)
    {
      std::tcout << _T("Hello, ") << argv[k] << _T("!") << std::endl;
    }
  }
  return 0;
}

引用返信 編集キー/
■67658 / inTopicNo.5)  Re[4]: コマンドライン引数を使った場合の文字化け
□投稿者/ επιστημη (80回)-(2013/08/21(Wed) 20:01:06)
επιστημη さんの Web サイト
> ANSI/UNICODE をコンパイルオプションに全面的にお任せするようなコードも。

ないす。

> #ifdef _UNICODE
> #define tcout wcout
> #else
> #define tcout cout
> #endif

#defineが気に入らんヒトには:

namespace std {
  basic_ostream<_TCHAR>& tcout =
#ifdef _UNICODE
    wcout;
#else
    cout;
#endif
}

とかね。

引用返信 編集キー/
■67659 / inTopicNo.6)  Re[5]: コマンドライン引数を使った場合の文字化け
□投稿者/ Jitta (63回)-(2013/08/21(Wed) 22:07:56)
Jitta さんの Web サイト
No67658 (επιστημη さん) に返信
>>#ifdef _UNICODE
>>#define tcout wcout
>>#else
>>#define tcout cout
>>#endif
>
> #defineが気に入らんヒトには:
>
> namespace std {
> basic_ostream<_TCHAR>& tcout =
> #ifdef _UNICODE
> wcout;
> #else
> cout;
> #endif
> }

やっぱり、ここは定義しなきゃいけないのね。TCHAR.H みたいなのは用意されてないのね。。。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -