Windowsに外字なるものが存在すると知って。検索するとshift-jisに存在しない文字を登録する記事がたくさん出てきましたが、これってUTF-8でも言えることなんじゃ…と思ってしまった今日この頃。そもそも外字で登録した場合、UTF-8とshift-jisで互換性はあるのかどうなのか。
いちいちやってみないと気が済まない質なので実験してみます。
まずは外字登録!
雑に顔文字を追加してみた。MSDNで登録方法書いてあるのは見つけたけど、記事が明らかに古い。まあMicrosoftさんは推奨していないと。まあそうですよね。


で、作ったファイルの文字コードを変換するコードを書いてみる
using System.IO;
using System.Text;
namespace ConsoleApp11
{
class Program
{
static void Main(string[] args)
{
using (var rstream = new StreamReader(@"C:\jikken\gaiji_shiftjis.txt", Encoding.GetEncoding("Shift_JIS")))
{
using (var wstream = new StreamWriter(@"C:\jikken\gaiji_utf8.txt", false, Encoding.GetEncoding("utf-8")))
{
wstream.Write(rstream.ReadToEnd());
}
}
}
}
}
変換!
無事に変換されました。コード的にもUTF-8用の空き番のコードになっているらしい。

結論
外字はプログラム的には別段特に気にしなくても動くらしい。けどもちろん、サーバ介すとか設定が違うマシンを通過する場合は外字登録していないと同じように表記はされないのでその部分は注意すること。
追加調査:登録した外字消してみた
消しても同じコードに変換されることは確認。文字は何も表示されませんが。
