読者です 読者をやめる 読者になる 読者になる

saLibrary

趣味プログラムの記録

文字コード変換

ソースコードをutf-8にする所まで。

まず最初に、型に別名をつけるだけのヘッダーを書きました。

//============================================================================================
//! @file   typedefine.h
//! @brief  saLibraryで使用する基本型定義
//============================================================================================
#pragma once
#include <cstddef>
#include <cstdint>
namespace sa {
    //  整数.
    using s64 = std::int64_t;
    using u64 = std::uint64_t;
    using s32 = std::int32_t;
    using u32 = std::uint32_t;
    using s16 = std::int16_t;
    using u16 = std::uint16_t;
    using s8  = std::int8_t;
    using u8  = std::uint8_t;

    //  実数.
    using f32 = float;
    using f64 = double;

    //  サイズ.
    using size_t = std::size_t;

    //  ポインタ.
    using uintptr = std::uintptr_t;
    using intptr  = std::intptr_t;
    using ptrdiff = std::ptrdiff_t;

    //  文字.
    using c8  = char;
    using c16 = char16_t;
    using c32 = char32_t;
}
//=============================================
//  End of File.
//=============================================

毎回同じようなもの書いている気がしますが前のライブラリからの変更点としては、C++11から追加されている型に甘えている点。
素直にstd::int32_tなど直接書いてもいいんですが、s32と書くことに慣れきっているので別名を付けました。
あとs32の方が短くてシンプルだし。
深い意図はないですがtypedefじゃなくてエイリアステンプレートにしてみました。

今回の記事はこのヘッダーの内容についてはどうでもいいのですっ飛ばします。
特に何も考えずにファイルを新規作成した所、やっぱり文字コードはShift-JISになっていました。
文字コードをutf-8に変更しようと思いファイルメニューを開いたところ、変更できる項目が見当たらない。
f:id:sacky003:20170506201228p:plain:w300
自分の記憶が正しければこの中に保存オプションの項目があったはずですが…。あれか、メニューの表示項目の設定が必要なのかな?

一応名前を付けて保存の所から変更可能なのでそこからやってみます。
f:id:sacky003:20170506201614p:plain:w300
しかしこれではいちいち上書き保存する旨を聞かれるしテンポが悪いと感じます。
それに結局デフォルトShift-JISなのでutf-8に変更し忘れは変わらないですし。

という事でnkfを使って全部変換するようにしました。
「nkf Windows」でググって出た最初のページを参考にnkf32.exeを取得。
(説明超絶割愛)

build/sourceディレクトリの階層にtoolsディレクトリを作り、中にconvertUTF8を作成してその中に突っ込みました。
f:id:sacky003:20170506202335p:plain:w300
buildはビルドする奴ら。
sourceはソースコードな奴ら。
toolsは…ライブラリ開発に関連するツール群な奴らなイメージ。

ビルドに必要なのでbuildの中でもいいかもしれませんね。
toolの最後にsを付けたけど、それならbuilder/sourcesにした方が良かったカモ。まぁいいか。

batに関しては単にsourceの中の*.hと*.cppに対してnkf32.exeを呼び出してutf-8に変換するだけです。
convertUTF8.bat

@rem ================================================================
@rem   ソースコードをutf-8に変換するbat.
@rem ================================================================
@echo off
echo --- convert *.h
for /r ..\..\source\ %%i in (*.h) do (
  call nkf32.exe -w --overwrite %%i
)
echo --- convert *.cpp
for /r ..\..\source\ %%i in (*.cpp) do (
  call nkf32.exe -w --overwrite %%i
)
echo done.
pause

手動でbat起動して変換する流れですが、ビルドイベントに組み込むべきなんでしょうか。
そうするといちいち全ソース変換が掛かって常にリビルド状態になる気がしますね。
ビルドイベントに組み込む場合、utf-8じゃないソースだけ抽出してそれだけ変換するべきですかね。
"-g"オプションで検査できますが、BOMのありなしまで分かったどうかちょっと怪しい。BOMありが混入するかも。

話は変わりますが、BOM無しのutf-8がVisualStudioでちゃんと認識してくれて感動モノです。
今まではBOM無しのファイルを読み込んだら認識できないタイプうんたらかんたらとダイアログがでて、勝手にBOMが付与されていたのにね。
ちゃんと保存オプションにもシグネチャ無しが増えておりました。
f:id:sacky003:20170506203523p:plain:w300
いいですね、VisualStudio進化してますね。

しかし次はWindowsとMacの改行コードで揉めそうですね。

今回はnkfでutf-8にするbat作っておしまい。
今回もプログラミングせず。
いいんです、外堀から埋めていくタイプなので。


・・・
・・・


今回はnkfを使いましたが、再度調べるとVisualStudioの拡張機能により、VisualStudioで完結できる方法もあるみたいです。
https://blogs.msdn.microsoft.com/jpvsblog/2015/08/03/visual-studio-2015-shift-jis/pronama.azurewebsites.net
これは便利。

また、VisualStudioの公式ブログでもutf-8に変換する方法が紹介されていました。
blogs.msdn.microsoft.com
PowerShellを使う方法なので他のソフトのインストールを必要とせずWindowsで完結できるのでnkf落としてくるよりこちらの方がいいかもしれません。