フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: ソースコードをすべて UTF-8 にする
DEKO
管理者
投稿数: 2690
ソースコードをすべて UTF-8 にする
on: 2015/06/18 02:30 Thu

お題の通りです。

program ANSI2UTF8;

{$APPTYPE CONSOLE}

uses
System.SysUtils, System.Classes, System.IOUtils, System.StrUtils, System.WideStrUtils;

const
SearchOption: array [Boolean] of TSearchOption =
(TSearchOption.soTopDirectoryOnly, TSearchOption.soAllDirectories);

begin
var Dir := '';
var Enc: TEncoding := nil;
var ErrFlg := False;
var IsBackup := False;
var IsRecursive := False;

Writeln('ANSI to UTF-8 File Converter - Copyright (c) 2021 DEKO');
repeat
if ParamCount = 0 then
begin
ErrFlg := True;
Break;
end;
IsBackup := FindCmdLineSwitch('b', True);
IsRecursive := FindCmdLineSwitch('r', True);
var sCodePage := '';
var IsCodePage := FindCmdLineSwitch('c', sCodePage);
if IsCodePage then
begin
var CodePage := StrToIntDef(sCodePage, -1);
if CodePage = -1 then
begin
Writeln('Invalid Codepage.');
ErrFlg := True;
Break;
end
else
Enc := TEncoding.GetEncoding(CodePage);
end;
Dir := ExpandFileName(ParamStr(ParamCount));
if not TDirectory.Exists(Dir) then
begin
Writeln('Invalid Path.');
ErrFlg := True;
Break;
end;
until True;

if ErrFlg then
begin
Writeln(#$0D#$0A'Usage: ' + TPath.GetFileNameWithoutExtension(ParamStr(0)) + ' [-B] [-C CodePage] [-R] ProjectDir');
Writeln('');
Writeln(' -B'#$09#$09'Create Backup File');
Writeln(' -C CodePage'#$09'Set CodePage');
Writeln(' -R'#$09#$09'Recursive');
ExitCode := -1;
Exit;
end;

ExitCode := 1;

if Enc = nil then
Enc := TEncoding.GetEncoding(0);

var MS := TMemoryStream.Create;
var SL := TStringList.Create;
try
Writeln('');
for var FileName in TDirectory.GetFiles(Dir, '*.*', SearchOption[IsRecursive]) do
begin
var Ext := LowerCase(TPath.GetExtension(FileName));
if not MatchStr(Ext, ['.pas', '.inc', '.dpr', '.dpk']) then
Continue;
MS.LoadFromFile(FileName);
if not HasUTF8BOM(MS) then
begin
MS.Position := 0;
SL.LoadFromStream(MS, Enc);
SL.SaveToFile(FileName, TEncoding.UTF8);
if IsBackup then
begin
MS.Position := 0;
MS.SaveToFile(FileName + '.bak');
end;
Writeln(FileName);
end;
end;
finally
SL.Free;
MS.Free;
Enc.Free;
end;

ExitCode := 0;
end.

 
コンソールアプリケーションです。次のようにして実行します。

ANSI2UTF8 <プロジェクトフォルダ>

 
※実行前に必ずバックアップを取ってください。

DEKO
管理者
投稿数: 2690
Re: ソースコードをすべて UTF-8 にする
on: 2015/06/18 16:20 Thu

-C オプションと -R オプションを付けてみました。

-C コードページ: 指定されたコードページから UTF-8 へ変換する。
-R: ディレクトリを再帰的に検索する。

 
-R は説明不要でしょう。

-C についてですが…例えば http://www.delphikingdom.com/ にある expr.zip を解凍すると、ロシア語で書かれたソースコードがありますが、ロシア語なので普通に Delphi (with 日本語環境) で開くと Shift_JIS -> UTF8 変換してしまうので文字化けしてしまいます。そこで、

ANSI2UTF8 -C 1251 -R C:\expr

 
このようにコードページを指定して実行するとロシア語が化けずに済みます。SynEdit とかも一部化けますよね。

DEKO
管理者
投稿数: 2690
Re: ソースコードをすべて UTF-8 にする
on: 2015/06/18 17:22 Thu

-B オプションを付けてみました。

-B: バックアップファイルを生成する

 
*.pas に対してオリジナルファイルを *.pas.bak として生成します。面倒でも -B オプションは毎回付けたほうがいいかと思います。

DEKO
管理者
投稿数: 2690
Re: ソースコードをすべて UTF-8 にする
on: 2021/11/02 11:56 Tue

ソースコードを整理しました。

インライン変数宣言を使っているので、Delphi 10.3 Rio 以降でないとコンパイルできませんが、Community Edition もインライン変数宣言対応になってますし、訓練された Delphi 使いが Delphi XE 辺りで動くように修正するのは造作ないと思います。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.033 sec.