皆さんはファイル読み込みの際に
文字コードで苦戦したことはありますか?
今回は文字コードを判定する試みを
したいと思います。
100% 正確にとはいかないかもしれませんが
用意した実験データでは
全て正常に判定された実績のある
コードを公開したいと思います。
判定に使用したコード
public partial class FileLoadTest
{
private string LoadFile(string filePath)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // GetEncoding(932) を使用するためのおまじない
string utf8 = File.ReadAllText(filePath); // utf8 で読み込んだ文字列
string shift = File.ReadAllText(filePath, System.Text.Encoding.GetEncoding(932)); //shift-jis で読み込んだ文字列
string utf8Replace = utf8.Replace("�", ""); //代用文字を取り除いた文字列(ここは代用文字を調べて置き換えて下さい)
string shiftReplace = shift.Replace("�", ""); //代用文字を取り除いた文字列(ここは代用文字を調べて置き換えて下さい)
int utf8Length = System.Text.Encoding.UTF8.GetByteCount(utf8);
utf8Length += 12 * (utf8.Length - utf8Replace.Length); //shiftLength と同じ内容のペナルティ
int shiftLength = System.Text.Encoding.UTF8.GetByteCount(shift);
shiftLength += 12 * (shift.Length - shiftReplace.Length); //代用文字に対し 12 byte のペナルティ
if (utf8Length < shiftLength)
{
return utf8;
}
else
{
return shift;
}
}
}
使用する場合は
「utf8.Replace("�", "")」
「shift.Replace("�", "")」
の部分に対して代用文字を調べて
置き換える必要があります。
ひし形にハテナマークの文字だと思います。
utf8 と shift-jis の
代用文字に 12 byte のペナルティを課した上で
文字数を比較する事で
どちらの可能性が高いかチェックしています。
チェックする文字コードを増やすことで
対応できる文字コードの種類も増えます。
以上文字コードの判定方法について紹介しました。
昔苦戦した覚えがあるため
皆さんの作業量が減れば良いと思い
記事にしました。
昔に作ったコードを記事にしたため
もしかしたらペナルティシステムに関しては
参考にしたサイトがあるかもしれません。
しかしながら現在調べた限りでは
そのサイトが見つからなかったため
申し訳ありませんが参考サイトの記載は無しです。
万一参考にしたサイトに心当たりがある方は
是非コメント欄で教えて頂けると幸いです。
皆さんの助けになれますように。
閲覧ありがとうございました。