koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

.NETでShift_JISからUTF-8に変換するNuGetパッケージを作った

VBのソフトをC#に移植していて、ちょいちょいShift_JISのファイルをUTF-8に変換したいことがある。

その都度スニペットをコピペするのも飽きてきたのでパッケージにしてみた。

www.nuget.org

Package Description

ダサいDescriptionだ。

github.com

using System.IO;
using ShiftJISExtension;

using (var utf8stream = await File.Open("sjis.txt").ToUTF8Async())
using (var reader = new StreamReader(utf8stream))
{
    // ...
}

多分こんな感じで使えます。Shift_JISUTF-8に変換したいぜ!!! という人はどうぞ。

CP932

Shift_JISは色々あって難しいのだけれど、Windows標準で使ってるShift_JISならこれでいいんじゃないの。くらいの気持ちでそれにしてみた。

Shift_JIS - Wikipedia

Shift_JIS難しすぎる。

文字コードの変換

文字コードの変換は多分色々手法があるのだろうけれど、今回は変換元がShift_JISであると決め打ちできるので単にShift_JISとして読み込んで.NETの世界の文字列にして、それをUTF-8で出力している。

ShiftJISExtension/ShiftJISStreamExtension.cs at ca06fe94bf0aae3331bb13221ebe6dc50e6ed787 · 7474/ShiftJISExtension · GitHub

var inputBytes = inputMs.ToArray();
var inputStringFromEnc = fromEnc.GetString(inputBytes);
var inputStringToEnc = toEnc.GetString(inputBytes);

converted = toEnc.GetBytes(inputStringFromEnc);

変換元を決め打ちできない場合、マシンパワーは使うけれど想定されるエンコーディングでの読み込みと保存を順番に試していって、保存しても文字列が変化しないエンコーディングだろうと当たりをつけることができる。

var isUtf8 = inputBytes.SequenceEqual(toEnc.GetBytes(inputStringToEnc));

元々UTF-8だったらそのままでいいので、元のストリームのコピーを返すようにしている。