rksoftware

Visual Studio とか C# とかが好きです

動画編集が GUI で大変なので、何とかしたい その2

最近は YouTube 動画をたくさん作っています。

しかしこの動画作成が大変です。こんな感じの元動画ファイルを動画編集ソフトで編集しています。

GUI で操作しなければならず、マウスクリックや繊細なドラッグ、癖がありマウスクリックを何度もしたうえでの数値入力など、編集が効率的とは言えません。

そこで、動画プロジェクトの編集データを直接編集しなければやってられない。そういう結論に至ることありますよね? そう。いまがどのときです。

■ 動画への文字入れの文言

幸いにも文字列データは比較的わかるフォーマットで値が格納されるようです。

メモリ制約に
関する注意点

という値が

メモリ制約に
関する注意点

として格納されます。

実際はこんな感じですね。

<PARAM NAME="TITLE_USERDATA_ALIAS" TYPE="WCHAR_POINT" VALUE="メモリ制約に
関する注意点"/>

というわけで、この文字列フォーマットを GitHub Copilot に聞いてみましょう。

■ 問い

メモリ制約に
関する注意点

という値が

メモリ制約に
関する注意点

という値で保持されるようです。この文字列格納フォーマットは何ですか?

■ 回答

ご質問の内容について解説します。

現象の整理

  • 元の文字列:
    メモリ制約に 関する注意点 (改行あり)

  • 格納されている値:
    メモリ制約に
関する注意点 
 という文字列が入っている)


この文字列格納フォーマットは何か?

1. 
 について

  • 
 はXMLやHTMLで「改行(LF)」を表す文字参照です。
  • xA は16進数で「10」、つまりASCIIコードのLF(Line Feed)です。

2. 
 について

  • & は「&」のエスケープ(XML/HTMLで使われる)。
  • つまり、
 は「
」という文字列をエスケープして格納している状態です。

3. どういうフォーマットか?

  • これは XMLエスケープされた文字参照 です。
  • 本来改行を表す 
 を、さらにXMLの属性値やテキストノードなどで使うために 
 とエスケープしています。
  • 例えば、XMLの属性値に改行を直接入れると問題があるため、
 で表現し、それをさらにエスケープして 
 となることがあります。

まとめ

この文字列格納フォーマットは、
「XMLエスケープされた文字参照(改行)」です。

  • 改行(LF)を 
 で表現し、
  • それをさらにXMLエスケープして 
 となっています。

用途例

  • XMLファイルの属性値や要素内で改行を表現したい場合
  • 何らかの設定ファイルやデータ交換で改行を安全に格納したい場合

参考


■ なるほど

なるほど、と分かればこの変換をする C# コードが欲しくなるのが人間です。GitHub Copilot に聞いてみましょう。

■ 問い

メモリ制約に
関する注意点

という値が

メモリ制約に
関する注意点

というXMLエスケープされた文字列にする C# コード

■ 回答

C# で文字列を XML エスケープし、改行(\n)を 
 に変換するには、以下のようなコードが使えます。

using System.Security;
using System.Xml;

string input = "メモリ制約に\n関する注意点";

// 1. XML エスケープ
string escaped = SecurityElement.Escape(input);

// 2. 改行を 
 に変換
escaped = escaped.Replace("\n", "
");

// 結果
Console.WriteLine(escaped);
// 出力例: メモリ制約に
関する注意点

ポイント - SecurityElement.Escape で XML エスケープ(<, >, &, ", ' など)を行います。 - その後、改行文字(\n)を &#xA; に置換します。

もし、改行が \r\n の場合は、先に \r\n&#xA; に置換し、次に \n&#xA; に置換してください。

escaped = escaped.Replace("\r\n", "&#xA;").Replace("\n", "&#xA;");

まとめ
このコードで、

メモリ制約に
関する注意点

メモリ制約に&#xA;関する注意点

というXMLエスケープされた文字列になります。

■ なるほど

何やら違和感を感じますが、このコードを実行してみましょう。

メモリ制約に&#xA;関する注意点

違うそうじゃない。

■ 修正

// 1. XML エスケープ  

// 2. 改行を &#xA; に変換  

の順番が逆ですね。

using System.Security;
using System.Xml;

string input = "メモリ制約に\n関する注意点";

// 2. 改行を &#xA; に変換
string escaped = input.Replace("\n", "&#xA;");

// 1. XML エスケープ
escaped = SecurityElement.Escape(escaped);

// 結果
Console.WriteLine(escaped);
// 出力例: メモリ制約に&#xA;関する注意点

出力

メモリ制約に&amp;#xA;関する注意点

できました。

■ GitHub Copilot って本当にいいものですね。

簡単にフォーマットがわかって変換コードまでできました。
GitHub Copilot って本当にいいものですね。