忘れる前に覚書。優しい文章を目指します。
ザ・覚書 ザ・覚書
出来るだけ子供にも、わかりやすいように書いて行きたいと思います。

PCバージョンでサイトを表示しています。
【ザ・覚書 3クリックアンケート実施中】
暑さの一番の原因はなんだと思いますか?
あなたの支持する政党はどの党ですか?

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として扱われる。

例えば、(変数宣言略)

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)



ファイル関連
C言語 ファイルオープン・クローズ
乱数
C言語 乱数発生関数例
Bitで遊ぶ
C言語 1バイトの数値内の何ビット目に1があるか返す関数例
C言語 1バイトの数値内の指定ビットの値を返す関数例
C言語 1バイトの数値内の指定ビットの値を1にする関数例
C言語 1バイトの数値内の指定ビットの値を0にする関数例
C言語 1バイトにいろいろな状態を入れてみる例
文字列操作
C言語 整数値を文字列に変換する関数例
C言語 ”ダブルコーテーションを文字列として扱う場合
C言語 CSVファイル形式のファイル内容を読み込む関数例
C言語 strtokでは連続トークンを正しく読み込まない
VisualC
C言語 とにかく自力でウィンドウ
C言語 UTF-8のファイル操作
その他
メモリリーク GDI関連のチェック方法
作ってみたアプリ
BMPの部分保存をするアプリ「ビットマップファイル部分取得」
16進数を自動加算してテキスト出力するアプリ
テキストファイル(txt)を字幕ファイル(srt)に変換するアプリ
C#
C# ファイルオープン・1行ずつ読み込み・書き込み・クローズ
C#のEXEは、中のソースコードのロジックを簡単に見られてしまうかも知れない
【ザ・覚書 3クリックアンケート実施中】
暑さの一番の原因はなんだと思いますか?
あなたの支持する政党はどの党ですか?

今のページの関連ページのリストへ
ザ・覚書のトップページに戻る
全ページのリストへ