C言語 UTF-8のファイル操作
☆C言語 UTF-8のファイル操作
VisualCで、文字コードUTF-8の読み込み書き込みを行いたい時に、
結構、悩んだ事があったのでメモしておきます。
わかれば簡単な事ではあったのですが。
色々悩んだ挙句の結果を書くと・・・。
デフォルトの環境では、
Cソースコードは、おそらく、
s-jisで記述されている。
VisualC2015で見ると、
「プロジェクトの設定」の「全般」の文字セットは、
デフォルトで、Unicode文字セットとなっている。
(昔のVCには、この設定はなかったような気がするが、201X辺りから現れた記憶。
たぶん、昔のプロジェクトを新版に切り替えて行くと、「空白」=「設定なし」になると思われる。)
Unicode(ユニコード)とは、
世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで
作られたらしい。
「マルチバイト文字セット」使わない。
(普通、作ったUTF-8ファイルは、Unicodeと思われる。)
調べてみると、
「プロジェクトの設定」の「全般」の文字セットは、
「空白」=「設定なし」の場合は、
ANSI版になるとの事らしい。
ANSIとは、Shift_JIS が拡張されたものらしい。
私の場合、これで動かしました。
文字セット「設定なし」で、UTF-8のファイルを読んでも
問題なく処理は出来た。
(ちなみにデフォルト値のUnicode文字セットでも出力ファイルは同じ結果になった。)
この状態でコードをコンパイルすると、
読み込んだファイルは、UTF-8として読むが、
ソース内記述の全角文字は、s-jisとして扱われる。
例えば、(変数宣言略)
VisualCで、文字コードUTF-8の読み込み書き込みを行いたい時に、
結構、悩んだ事があったのでメモしておきます。
わかれば簡単な事ではあったのですが。
色々悩んだ挙句の結果を書くと・・・。
デフォルトの環境では、
Cソースコードは、おそらく、
s-jisで記述されている。
VisualC2015で見ると、
「プロジェクトの設定」の「全般」の文字セットは、
デフォルトで、Unicode文字セットとなっている。
(昔のVCには、この設定はなかったような気がするが、201X辺りから現れた記憶。
たぶん、昔のプロジェクトを新版に切り替えて行くと、「空白」=「設定なし」になると思われる。)
Unicode(ユニコード)とは、
世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで
作られたらしい。
「マルチバイト文字セット」使わない。
(普通、作ったUTF-8ファイルは、Unicodeと思われる。)
調べてみると、
「プロジェクトの設定」の「全般」の文字セットは、
「空白」=「設定なし」の場合は、
ANSI版になるとの事らしい。
ANSIとは、Shift_JIS が拡張されたものらしい。
私の場合、これで動かしました。
文字セット「設定なし」で、UTF-8のファイルを読んでも
問題なく処理は出来た。
(ちなみにデフォルト値のUnicode文字セットでも出力ファイルは同じ結果になった。)
この状態でコードをコンパイルすると、
読み込んだファイルは、UTF-8として読むが、
ソース内記述の全角文字は、s-jisとして扱われる。
例えば、(変数宣言略)
fopen_s(&fpLoad, szFileName1, "r");
fopen_s(&fpWrite szFileName2, "r");
while (fgets(szBuf, sizeof(szBuf), fpLoad) != NULL)
{
fprintf(fpWrite, "%s\n", "szBuf");
}
fprintf(fpWrite, "もじもじ\n");
fclose(&fpLoad);
fclose(&fpWrite);
などすると、
ファイルから読み込んだszBufは、UTF-8だが、
「もじもじ」が、s-jisで書き込まれ、
UTF-8とs-jisが混合したテキストファイルが出来てしまう。
これを回避するには、
ソース内記述の全角文字を、UTF-8に変換してから書き出す。
ShiftJisToUTF8(szBuf2, sizeof(szBuf2), "もじもじ" ); ← 自作関数
fprintf(fpWrite, "%s\n", szBuf2);
他の方法として、
#pragma execution_character_set("utf-8")
を書く方法もあり、
ソース内記述の文字列をUTF-8にする模様。
これをすればソース内記述のfprintf("もじもじ")などは文字化けしないが、
私のプロジェクトの場合、タイトルバーの文字化けが発生してしまった。
メニューは正常。
これは直し方が今はわからない。(タイトルバー文字列だけs-jisに直す必要性?)
他にもどんな問題が発生するかわからないので、
これは使わなかった。
雑記、
fopen_s(&fpLoad, szFileName1, "w, ccs=UTF-8");
などでopenを試したが、どうも挙動不審になった。
コードが悪かったのか、フリーズすることもあり、
これも使用しなかった。、
ちなみに、デバッグ時に、読み込んだUTF-8の文字は、
普通なら文字化けして見える。
文字を普通に表示させたい場合、ウォッチで変数の後に ,s8 を入れると
読める文字になる。
記述:2017年03月頃
Twitter
Facebook
Google+
はてな
Pocket
LINE
管理人による書き込みの確認後、荒らし書き込みでない場合に表示させていただきます。
悪意ある書き込みや挑発的な書き込みと思われる内容は、表示させません。
その為、ちょっと書き込みから表示までに時間がかかってしまいます。ご了承下さい。
<No.2> 管理者
情報ありがとうございます。
確認すると、
2015では、デフォルトで「Unicode文字セット」のようですね。
修正しておきます。
visual C6から変換したプロジェクトをずっと使っていて、
それでは、文字セットは、空白になり、
デフォルトで、指定なし、設定なしと書いてしまいました。
指定なしは、調べるとANSI版になるとの事らしいので書いておきます。
(2017/03/09)
<No.1> 名無しさん
>「プロジェクトの設定」の「全般」の文字セットは、
>「空白」=「指定なし」がデフォルトで、
>この場合、「Unicode文字セット」が使われる。
デフォルトは指定なしじゃないし、指定なし=Unicodeでもない
(2017/03/09)
情報ありがとうございます。
確認すると、
2015では、デフォルトで「Unicode文字セット」のようですね。
修正しておきます。
visual C6から変換したプロジェクトをずっと使っていて、
それでは、文字セットは、空白になり、
デフォルトで、指定なし、設定なしと書いてしまいました。
指定なしは、調べるとANSI版になるとの事らしいので書いておきます。
(2017/03/09)
<No.1> 名無しさん
>「プロジェクトの設定」の「全般」の文字セットは、
>「空白」=「指定なし」がデフォルトで、
>この場合、「Unicode文字セット」が使われる。
デフォルトは指定なしじゃないし、指定なし=Unicodeでもない
(2017/03/09)
暑さの一番の原因はなんだと思いますか?
あなたの支持する政党はどの党ですか?
今のページの関連ページのリストへ
ザ・覚書のトップページに戻る
全ページのリストへ