VisualStudioの文字コードについて

このQ&Aのポイント
  • WindowsとLinuxでの文字コード設定による文字化けの問題
  • ソースコードの文字コード変更だけでは解決しない可能性
  • 要因不明の文字化けに悩んでいる
回答を見る
  • ベストアンサー

VisualStudioの文字コードについて

現在、WindowsとLinux(Unix)でソケット通信を行い、文字のやり取りをするプログラムを作成しています。 ソースコードやコンパイルの環境は、 Windows側(Windows7):C言語(Windowsプログラミング)、VisualStudio2013でビルド&実行 Linux側:C++、g++(Cygwinを使用) です。 Windows側のソースコードがShift-JIS、Linux側がUTF-8であり、このままだと文字化けしてしまうため、Windows側のソースコードをUTF-8に変更(VisualStudioでソースコードを保存するときに「エンコード付きで保存」を使用)して再度ビルド、実行を行ったのですが、やはり文字化けしてしまいます。 ソースコードの文字コードを変更しただけでは不十分なのでしょうか? 原因があまりよく分からず困っています。 もし何か分かることがあれば教えていただきたいです、よろしくお願いします。 (もしかしたらカテゴリ違いかもしれません、申し訳ありません)

質問者が選んだベストアンサー

  • ベストアンサー
  • ques9900
  • ベストアンサー率34% (47/136)
回答No.2

http://sayahamitt.net/utf8%E3%81%AAstring%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%89shiftjis%E3%81%AAstring%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B%E9%96%A2%E6%95%B0%E4%BD%9C%E3%81%A3%E3%81%9F/ 後は通信時のエンディアン変換ですかね。 2バイト文字だとエンディアン変換しないとやられるかも。 でもLinux側のCPUもIntelなら大丈夫な気がしますけど。 通信する際はビックエンディアンにしましょうという事なので念の為、 http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock4.html

113sigma
質問者

お礼

回答ありがとうございます。 お返事が遅くなってしまい、申し訳ありません。 教えていただいたサイトを参考にし、受信したものをShift-JISに変換して表示するようにしたのですが、終端記号が入っていないためか、文字の末尾に????や||などのごみが入ってしまっています。 一応受信した時点で終端記号'\0'を入れ、Shift-JISに変換してからも終端記号'\0'を入れるようにしたのですが、うまくいっていないようです。 多分Shift-JISに変換した後に終端記号を入れる操作の方がおかしいのだと思いますが、どう直せばよいのか分からず困っています。 もし何か分かりましたら教えていただけると幸いです。よろしくお願いします。 参考までに、受信後の処理部分のプログラムを掲載します。 char buf[MAX_MESSAGE]; // 受信バッファ int length_unicode, length_sjis; int mtow_written, wtom_written; UINT codepage = CP_UTF8; nRcv = recv(ns_adda, &buf, MAX_MESSAGE, 0); if (nRcv > 0) { //受信文字列の末尾に'\0'を追加 buf[nRcv] = '\0'; //ワイド文字(Unicode)に変換した場合の文字列長を調べる length_unicode = MultiByteToWideChar(codepage, 0, buf, strlen(buf), NULL, 0); //文字列長の分だけバッファを確保 wchar_t *ws = (wchar_t *)calloc(length_unicode, sizeof(wchar_t)); //UTF-8からワイド文字に変換 mtow_written = MultiByteToWideChar(codepage, 0, buf, strlen(buf), ws, length_unicode); if (mtow_written == 0){ //エラー処理 MessageBeep(MB_ICONEXCLAMATION); MessageBox(hWnd, TEXT("utf-8からUnicodeへの変換に失敗しました"), szAppName, MB_ICONEXCLAMATION | MB_OK); return TRUE; } length_sjis = WideCharToMultiByte(932, 0, ws, wcslen(ws), NULL, 0, NULL, NULL); char *ms = (char *)calloc(length_sjis + 1, sizeof(char)); // ワイド文字からマルチバイト文字に変換 wtom_written = WideCharToMultiByte(932, 0, ws, wcslen(ws), ms, length_sjis, NULL, NULL); if (wtom_written == 0){ //エラー処理 MessageBeep(MB_ICONEXCLAMATION); MessageBox(hWnd, TEXT("Unicodeからsjisへの変換に失敗しました"), szAppName, MB_ICONEXCLAMATION | MB_OK); return TRUE; } //終端文字を追加(ここがおかしい?) ms[wtom_written] = '\0'; //認識結果をメッセージボックスで表示(終端記号が入っていないため末尾にごみが入る) MessageBox(hWnd, ms, TEXT("受信結果"), MB_OK); }

その他の回答 (2)

  • ques9900
  • ベストアンサー率34% (47/136)
回答No.3

http://proger.blog10.fc2.com/blog-entry-67.html マルチバイト文字列の終端文字は"\0\0"みたいだよ。 一個だと終端と思われないっぽい。

113sigma
質問者

お礼

回答ありがとうございます。 >マルチバイト文字列の終端文字は"\0\0"みたいだよ。 >一個だと終端と思われないっぽい。 そうなんですね、知らなかったです・・・。 教えていただいたことを踏まえて、MultiByteToWideCharの第三引数に+1したところ、正しく動作しました。 あとは送受信の際のバイトオーダーの変換についてですが、こちらについても少し分からないところがあるのでまた新しく質問をしようと思います。 ありがとうございました!

  • hoge1229
  • ベストアンサー率29% (58/194)
回答No.1

windowsでの入力/表示はshift-jis、linuxでの入力/表示はutf-8なので、マルチバイトの文字をやりとりするのであるのでしたらプログラムの中でそれぞれの文字エンコードに変換してあげる必要があります。

113sigma
質問者

お礼

回答ありがとうございます。 質問を投稿してから、色々と自分でも調べてみたところ、 こちらのサイト【http://ameblo.jp/tomisams/entry-11254343403.html】を参考にし、Windows側のプログラムの最初に #pragma execution_character_set("utf-8") をつけると、Linux側で受信した文字が文字化けせず正しく表示されるようになりました。 また、hoge1229さんがおっしゃるように、受信した文字列がwindows側でshift-jisで表示されてしまっているため、utf-8で受信したものをshift-jisに変換しなければならないのですが、その方法がいまいち分かりません。(iconvは使えないですよね・・・?) もし何かご存じでしたら、教えていただきたいです。お願いいたします。

関連するQ&A

  • Latexの文字化けについて教えてください!

    Windows 環境で Terapadを使ってtexファイルを書いたのですがlinuxで開けてみると文字化けが見られました。texファイルの文字化けはファイルの文字コード指定保存でUTF-8にて保存することでtexファイルの文字化けは治ったのですが、linux環境下で platex sample.tex と実行してdvioutで見るために xdvi sample.dvi とすると日本語が全て文字化けしています。 どうすれば文字化けが解消されるでしょうか?

  • 文字コードを確認するには(64bitRedhat)

    あるテキストファイルの日本語が文字化けしてしまったので、 試しにwindowsのクライアントにダウンロードしてIEで開いて確かめたところ、 ユニコード(UTF-8)にて正常に見ることができました。 しかし、Linuxに戻って、ロケールを ja_JP.utf8にしてみてもいぜんとして化けたままです。 どのようにして、Linuxでの文字コードを確認することができるのでしょうか?

  • データベースと文字コードの関係

    お恥ずかしい話ですが、文字コードのことが良くわかっておりませんので、utf-8を使ったデータベースをWindowsから取り扱う方法を教えて下さい。 Excelマクロからフリーのデータベースを使って簡単なアプリケーションを作成しようと思っています。 軽くて設定も簡単なSQLiteを使いたいのですが、文字コードがutf-8になっているとのことで、Windows上でCSVファイルをutf-8で保存してから、SQLiteのデータベースにインポートしてみました。 Windwosサーバー上にあるSQLiteに対して、コマンドラインでSELECT命令を発行したり、Excelのデータベースクエリーを実行したりしてみましたが、当然というべきか文字化けしてしまいます。 Excelのシート上で入力したS-JISの値をutf-8のSQLiteに書き込む(また、Excel上でSQLiteのコードを文字化けさせずに表示させる)には、どうしたらよいのでしょうか?

  • 複数のテキストの文字コード変更

    私は今、Linuxで簡単なプログラムを作りHPに載せたいと考えています。 そして実際に載せて見たのですが、日本語入力したところがどうしても文字化けしてしまいます。 そして、文字化けの原因が文字コードにあるとわかりutf-8からsjisに変換したところ、文字化けしないようになりました。 日に20数個ものプログラムを作り、アップロードするので1つ1つ文字コードを変更している状態です。 しかし、現状ではとても大変なので、スクリプトを作り、複数のファイルの文字コードを変更したいと考えているのですが、どのようにすればいいのでしょうか? どなたか教えていただけませんか?

  • 2つの文字コードの文字化けについて

    こんばんわ。 Linux使ってます。 わかりにくいかも知れませんが・・・ とあるHP更新ソフトを使ってるのですが、 そのHP更新ソフトが2つあり、 一つはShift_JISで自動でソースが書き出されます。 もう一つのソフトは自動でutf-8で書き出されます。 この時、バーチャルホストなので、 Apacheの設定は、noneにしてるので、 それぞれソフトで吐かれる文字コードに依存するようにしてます。 ですが、どうも、 cgiを使ってる所が文字化けしてしまいます。 utfで指定しないとダメなのかな・・・? 何か文字化けせず、 正常に表示させる方法はありますか? .htaccessなど使用も可能です。

  • oracleの文字コードとlinuxサーバの文字コードが異なる場合、サ

    oracleの文字コードとlinuxサーバの文字コードが異なる場合、サーバからシェルまたはsqlplusでDBに接続し、spoolコマンドで指定したファイルに、SQLの実行結果や、PLSQLのDNMS_OUTPUTで出力した内容を保存すると文字化けしてしまいます。 これを回避するにはどうすればよいのか、ご教授下さい。 具体的な環境は、下記の通りです。 oracles:SJIS(NLS-LANGはSJIS系にしています) サーバUTF8 出来ればUTF8でファイルに出力したいのですが、無理なら最低でもSJISで出力させたいです。現在は、ftpでバイナリーダウンロードさせて秀丸などのエディターで見ても、どちらとも認識できない文字コードになっているようです。 なお、お客様側のサーバなので、DBやOSの文字コードを変えることはできません。

  • リダイレクトする時の文字コードをUnicodeに

    現在、VisualStudioで、システムコールの標準出力結果をリダイレクトしてファイルに保存する プログラムを書いています。 _tsystem(command); のような感じで、commandには "hogehoge > hoge.txt"のように入ります。 ※command はTCHAR この出力結果が、Shift-Jisになっているようで、Shift-Jisだと日本語が文字化けせずに表示されるのですが、Unicode UTF-16にすると文字化けしてしまいます。 Unicode UTF-16とかUnicode UTF-8など文字コードを指定してリダイレクトできないのでしょうか。 ちょっと調べてみましたがうまく見つかりませんでした。

  • コピーすると文字コードが変わっちゃう

    プログラムを(ちなみにPHP)エディター(ちなみに秀丸)で入力して保存時にエンコードの種類を「Unicode(UTF-8)」で保存 もちろんプログラム(HTML/PHP記述)では <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> を指定しています 実行すると文字化けも起こらず正常にホームページが完成しました それをコピーして別のサーバーにアップすると正常にホームページが開かないんです 文字化けだけでなくソースが画面に表示されました そのソースも文字化けです コピー先をエディターで開くと「日本語(Shift-JIS)」になっていました コピー元は「Unicode(UTF-8)」です なぜでしょう? そもそも「Unicode(UTF-8)」をコピーするには単純にコピーしてはいけないのでしょうか? プログラムの量が結構あるのでこの「日本語(Shift-JIS)」を一括して「Unicode(UTF-8)」に保存できるようなツールはないのでしょうか?

  • VisualStudio 6.0 or 5.0?

    いつもお世話になっています。 VisualStudioでMFCを使って開発されたwindowsアプリを解析する仕事を担当することとなりました。解析するアプリケーションなのですが、ドキュメント等、何も残っていないのでどのような経緯、機能があるのかソースから判別するしかない状況です;;dswファイルがあるので6.0以前に作られたソースだとは思うのですが。 で、タイトルにもあるのですが、このdswファイルなどの情報からVisualStudioの5.0、6.0のどちらで開発されたソースかどうか判別できるのでしょうか?6.0の環境でソースコードは問題なくビルドできました。VisualStudio5.0をまったく触ったことが無いのと、5.0と6.0の互換性についての情報があまりないので調べる手段が無く結構困ってます。 回答よろしくおねがいします。

  • PHPファイル文字化けについて

    linux CentOS3(RedHat Enterprise3)を利用しています。 linuxは文字コードがEUCと認識しております。 そこでwindows上にてPHPファイルを作成、文字コードEUCにて保存し、 ffftpにてlinuxサーバにアップロードし、webページを参照してみました。 PHPファイルは以下の通りです。 <?php echo "こんにちは"; ?> 結果、InternetExplorerを利用し閲覧したところ文字化けにて表示されます。 文字コードは「UTF-8」が選択されています。 もちろん、文字コードを「EUC」に変更すると、 出力されてほしい文字列が表示されます。 これをInternetExplorerにて表示したとき、 文字化けしないような設定に変更したいと考えます。 どのような手順を踏めばよろしいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう