VisualStudio2005で以下のコードを実行したとき、ファイルをUTF-8で作成したいのですが、なにか方法がありますか?
現状では、SJISで出力されてしまいます。
ソースは、『ファイル』-『保存オプションの詳細設定』で『UTF-8(BOM付き)』にしてあります。
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp;
fp = fopen( "c:/temp/log.txt", "w");
fprintf( fp, "%s\n", "あいうえお" );
fclose( fp );
return 0;
}
ちなみに、”あいうえお”の部分を(EmEditorで)SJISに無くてUTF-8にだけ存在する文字にした場合、VisualStudioのエディタ上では正しく文字が表示されます。
したがって、VisualStudio内ではリテラルの文字コードはUTF-8で扱われていると考えられます。・・・が、上記プログラムで出力すると文字化けします。つまり、SJISで出力されてしまいます。
ご教授のほど、よろしくお願いいたします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
再回答で。
よく見たらソース全体がUnicode用になってないですよね、これ。
int main(int argc, char* argv[])
↓
int _tmain(int argc, _TCHAR* argv[])
fp = fopen( "c:/temp/log.txt", "w");
↓
fp = _tfopen( _T( "c:/temp/log.txt" ), _T( "w, ccs=UTF-8" ) );
fprintf( fp, "%s\n", "あいうえお" );
↓
_tfopen( fp, _T( "%s\n" ), _T( "あいうえお" ) );
_UNICODEを定義する。
tchar.hをインクルードする。
などの変更が必要です。
詳細はマニュアルの「Unicode プログラミングの要約」辺りを参照してください。
お礼が遅れて申し訳ありません。
現在別件作業中で、この問題は別担当者に任せていました。
現在の解決策としては、リテラル文字列使用時にsjis→UTF-8変換して動かしている状態です。
ご回答いただいた件、調査してみます。コンパイラオプションではなく、_UNICODEを定義することによってオブジェクトがUTF-8になる…ということ?ですかね。このようなことは、コンパイルオプションでやるものだとばかり思っていました。
色々な流れで、今回のコードはワンソースでWinとLINUX両方で動かす可能性が大です。したがって、Win独自のコーディングが出来ない(部分的なifdefはありますが)可能性大です。ご回答いただいた件がgcc(g++)で可能なのか合わせて調べてみたいと思います。
Win環境だけでの文字コード関係なしプログラミング…勉強不足を痛感です。
No.4
- 回答日時:
>したがって、UTF-8で書かれたソースコードがVisualStudioのエディタで正しく表示されているにもかかわらず、その文字列を出力するとsjisになってしまうのです。
出力したファイル(c:/temp/log.txt)がShift-JISになっている。
というのはどのように確認しましたか?
BOM付きで出力されていない場合、エディタの自動認識では失敗(UTF-8のつもりがShift-JIS)することもありますが…。
秀丸Ver8.10の自動認識ではShift-JISとして認識される。
そこからエンコーディングをUTF-8にして読み込みし直すとは『羽かんむりに軍(UTF-8コード0xE7,0xBF,0xAC)』になります。
もちろん、バイナリエディタで覗くと0xE7 0xBF 0xAC 0x0D 0x0Aです。
さらに、名前をつけて保存でBOM付きで保存して開き直すと、普通にUTF-8になります。
ソースファイルがBOM付きでも、そのコードから出力されるファイルには関係ないコトでしょう……。
# 実行バイナリ中のデータには影響するかも知れませんが…
fprintf()でなぜかDebug Assertionになってしまいます……>#3
fopen()でオープンはできるんですけど。
# VS2005SP1とVC++2008EE SP1で確認…。
この回答への補足
ご回答ありがとうございます。
出力したファイル(c:/temp/log.txt)がShift-JISになっている。
というのはどのように確認しましたか?
→ EmEditorとVisualStudioのバイナリエディタで確認しました。
ソースファイルがBOM付きでも、そのコードから出力されるファイルには関係ないコトでしょう……。
→ おっしゃる通りです。
私も、VS2005SP1で『No.3 jx-word』様の方法を試してみましたが、Assertionとなってしまいました。
皆様ありがとうございました。
結局、オブジェクトコードがUTF-8にならない限り、出力時のsjis→UTF-8変換が必用になるということですね。
先程exe内でリテラル文字列がsjisになっていることを確認しました。
追加確認結果です。
sjis範囲外のUTF-8(例えば羽かんむりに軍)はVisualStudioのエディタ上では表示されますが、オブジェクトコード上では0x3f(?)になってしまいます。
したがって、sjis→UTF-8変換も出来ないと思われます。0x3fはどう変換しても0x3fですから。
No.3
- 回答日時:
VS2005であればfopenの下記のパラメータ指定でいけるはずです。
fp = fopen("c:/temp/log.txt", "w, ccs=UTF-8");
詳細はマニュアルのfopenの項を参照してください。
この回答への補足
ご回答ありがとうございます。
VisualStudio2005+SP1で上記方法を試してみましたが、fprintf()でAssertionとなってしまいました。
『これだ!』と思ったんですけど…
皆様ありがとうございました。
結局、オブジェクトコードがUTF-8にならない限り、出力時のsjis→UTF-8変換が必用になるということですね。
先程exe内でリテラル文字列がsjisになっていることを確認しました。
追加確認結果です。
sjis範囲外のUTF-8(例えば羽かんむりに軍)はVisualStudioのエディタ上では表示されますが、オブジェクトコード上では0x3f(?)になってしまいます。
したがって、sjis→UTF-8変換も出来ないと思われます。0x3fはどう変換しても0x3fですから。
No.2
- 回答日時:
ソースファイルの文字コードが何であれ,コンパイル時に想定されるexecution character setが,
日本語環境においてShift_JISから変化するわけではありません。
# source character setが変化するだけ。
想定されるexecution character setへの変換はコンパイル時に行われるため,
・ソースファイル中ではwide string literalを使う
・必要に応じてUTF-16からUTF-8に変換する
という二段階で行う必要があります。
# chcp 65001したコマンドプロンプトでビルドすれば想定がUTF-8になるかもしれませんが,試していません。
この回答への補足
『想定されるexecution character setへの変換はコンパイル時に行われるため・・・』
→ と、言うことはコンパイル時にUTF-8のオブジェクトが出力できればいいわけですよね。
→ Linux環境のgcc(g++)はコンパイルオプション『-fexec-charset=xxxxx』があります。
たしかに、この機能を使ってLinux上でsjisのファイル操作(リテラル文字列を検索したり…)
したことがあります。
しかしながら、VisualStudioのコンパイルオプションには・・・見つけられませんでした。
これが出来れば、コーディング的にも綺麗に行けるんですけどね。
皆様ありがとうございました。
結局、オブジェクトコードがUTF-8にならない限り、出力時のsjis→UTF-8変換が必用になるということですね。
先程exe内でリテラル文字列がsjisになっていることを確認しました。
追加確認結果です。
sjis範囲外のUTF-8(例えば羽かんむりに軍)はVisualStudioのエディタ上では表示されますが、オブジェクトコード上では0x3f(?)になってしまいます。
したがって、sjis→UTF-8変換も出来ないと思われます。0x3fはどう変換しても0x3fですから。
No.1
- 回答日時:
Shift_JIS→UTF-8 変換かけるだけじゃないかと。
WideCharToMultiByte、MultiByteToWideChar 使えばたいした手間ではないでしょう。
この回答への補足
早速のご回答ありがとうございます。
確かにソースコードがsjisであればUTF-8変換すればOKです。
ところが、このソースコードはすでにUTF-8なのです。質問のところで『”あいうえお”の部分を…』と書きましたが、ここには実際には『羽かんむりに軍(UTF-8コード0xE7,oxBF,0xAC)』が書かれています。そして、VisualStudioのエディタでは、『羽かんむりに軍』は表示されています。
したがって、UTF-8で書かれたソースコードがVisualStudioのエディタで正しく表示されているにもかかわらず、その文字列を出力するとsjisになってしまうのです。
話を簡単にするために『あいうえお』と書いたために誤解させてしまったかもしれません。すみませんでした。
…というわけです。
ちなみに、『羽かんむりに軍』はsjisには無い文字です。
皆様ありがとうございました。
結局、オブジェクトコードがUTF-8にならない限り、出力時のsjis→UTF-8変換が必用になるということですね。
先程exe内でリテラル文字列がsjisになっていることを確認しました。
追加確認結果です。
sjis範囲外のUTF-8(例えば羽かんむりに軍)はVisualStudioのエディタ上では表示されますが、オブジェクトコード上では0x3f(?)になってしまいます。
したがって、sjis→UTF-8変換も出来ないと思われます。0x3fはどう変換しても0x3fですから。
さっき気付きましたが「επιστημη」さんだったんですね。DDJJ読んでました。光栄です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) 文字化け。メモ帳でUTF-8に変換後、エクセルへ貼り付けたいです。 3 2022/08/14 07:21
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
_tfopen について教えてください
C言語・C++・C#
-
fgetsで2行目から文字化け
C言語・C++・C#
-
unicode文字列(日本語)のファイル出力方法
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
fgets で値が取得できない
C言語・C++・C#
-
6
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
7
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
8
CStringをwchar_tに変換したい
C言語・C++・C#
-
9
fwprintf()について
C言語・C++・C#
-
10
CString から LPCTSTRの型に変換
C言語・C++・C#
-
11
画面を強制的に再描画させる方法
C言語・C++・C#
-
12
charからLPTSTRへの変換方法
C言語・C++・C#
-
13
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
14
visual c++でutf-8の扱い
C言語・C++・C#
-
15
適切な変換関数が存在しない???
C言語・C++・C#
-
16
C言語での引数の省略方法
C言語・C++・C#
-
17
■文字コード判定■
C言語・C++・C#
-
18
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
19
CSVファイル作成
C言語・C++・C#
-
20
std::stringからLPCWSTR型への変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++でUTF-8のファイルを出力し...
-
二次元配列をクリップボードに...
-
ファイルの文字コードをUTF-8に...
-
BitBltについて。
-
COBOLのファイル出力
-
Acccess レポートをグループ別...
-
外国語とCSVについて
-
Excel のページを Jpegファイル...
-
テキストファイルに改行コード...
-
ファイル出力の場所を指定
-
コマンド(例えばls)の出力結果...
-
CreateProcess関数と実行後の戻...
-
pcap形式データをテキストへ抽出
-
(VBA)書式が変更されてしまい...
-
raw形式からbmp形式への書き込...
-
エクセルVBA→シート名でCSV出力...
-
gccによって、BOM付きのUTF-8で...
-
Wordマクロで指定したフォルダ...
-
C言語での縦方向のファイル出力...
-
OCRで起こしたテキスト文字をCS...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++でUTF-8のファイルを出力し...
-
コマンド(例えばls)の出力結果...
-
ファイル出力の場所を指定
-
Acccess レポートをグループ別...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
テキストファイルに改行コード...
-
AccessVBA複数レポート条件毎に...
-
ファイルの文字コードをUTF-8に...
-
外国語とCSVについて
-
C言語のプログラムが異常終了し...
-
二次元配列をクリップボードに...
-
printfだと出力されるのにfprin...
-
ファイル形式またはファイル拡...
-
シェルコマンドの 2>&1 とはど...
-
VBA でメモ帳へ保存する際の保...
-
【ExcelVBA】UTF-8(BOM無)でC...
-
サウンド出力のデバイスを選択...
-
Wordマクロで指定したフォルダ...
-
アクセス>マクロ>テキスト変換
-
VB.NETでExcelファイルを出力す...
おすすめ情報