をチェックするためにちょっと実験してみましょう。
.NET 3.5な環境でコンパイルしてください
using System;
using System.IO;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var sb = new StringBuilder();
var shiftjis = Encoding.GetEncoding("shift_jis");
for ( var i = 0; i < 0xffff; i++)
{
//サロゲートペア飛ばし
if ( 0xd800 <= i && i <= 0xdfff)
{
continue;
}
var c = Convert.ToChar(i);
var bs = shiftjis.GetBytes(c.ToString());
var str = shiftjis.GetString(bs);
if ( c != str[0])
{
sb.AppendLine(string.Format("{0:X}\t{1}\t{2:X}\t{3}",i, c, Convert.ToInt32(str[0]), str));
}
}
var filepath =Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "testshiftjis.txt");
System.IO.File.WriteAllText(filepath, sb.ToString());
}
}
}
やっていることは簡単で、UnicodeからShiftJISに変換して、再度Unicodeにして元に戻っているかどうかを調べています。
サロゲートペア部分は今回の調査対象から外しています。(調査が面倒だから)
いちおうサロゲートペアを除くと63488通りの文字があるのですが、再変換すると54085文字も変わってしまいます。
大概は再変換後の文字が3F(?)になっていて、バインドされていないといわれる文字になっています。
それ以外の別の文字になってしまうというのが83文字あります。たぶんちゃんと表示されないと思いますが
もちろん結合文字も今回の対象から外しています。
一番多いのはウムラウト文字などの類ですね、ウムラウトが取れています。
純粋にShiftJISシステムに値を渡す場合にどうすべきかを考慮するための基礎資料として調査しているだけですので、.NET以外の場合の変換と同じかどうかはわかりません。
Yenマークも逆変換かけるとBackSlashになっているのがポイントですね。