LoginSignup
1
0

【C♯】ファイル読み込みの際に文字コードを自動で判定したい

Last updated at Posted at 2024-06-11

皆さんはファイル読み込みの際に
文字コードで苦戦したことはありますか?

今回は文字コードを判定する試みを
したいと思います。

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 のペナルティを課した上で
文字数を比較する事で
どちらの可能性が高いかチェックしています。

チェックする文字コードを増やすことで
対応できる文字コードの種類も増えます。


以上文字コードの判定方法について紹介しました。

昔苦戦した覚えがあるため
皆さんの作業量が減れば良いと思い
記事にしました。

昔に作ったコードを記事にしたため
もしかしたらペナルティシステムに関しては
参考にしたサイトがあるかもしれません。

しかしながら現在調べた限りでは
そのサイトが見つからなかったため
申し訳ありませんが参考サイトの記載は無しです。

万一参考にしたサイトに心当たりがある方は
是非コメント欄で教えて頂けると幸いです。

皆さんの助けになれますように。
閲覧ありがとうございました。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0