質問: 以下のPowerShellスクリプトでEncoding.GetStringメソッドを使ってcp932文字列から16byte切り出しました。 ``` $enc=[System.text.encoding]::default $bytes=$enc.getbytes("一二三四五 六七八") $enc.getstring($bytes, 0, 16) # 17bytes返される ``` 以下の文字列が17byte返されました。 一二三四五 六七・ 渡したい文字列はさまざまで1byte文字と2byte文字が混在していることもあります。 最後の文字の途中で切ることもありますが、 最後の「八」が中黒になっているのが不可解です。 最後の文字を空文字に変換して15byte返してくれると一番助かるのですが、 いずれにせよ16byteは超えないようにしたいです。 環境 Powershell 5.0.10586.117 .Net Framework 4.7 Windows 7 Professional Service Pack 1 x86 よろしくお願いいたします。
回答: 要は、MS932で16バイト以内に収まるように文字を切り出したいのですよね? PowerShellでどうやるのかはわかりませんが、C#ならばこんな感じでしょうか。 ``` [TestMethod] public void TestHoge() { var encoding = Encoding.GetEncoding("Shift_JIS"); var encoder = encoding.GetEncoder(); var buff = new byte[16]; int charsUsed, bytesUsed; bool completed; var target = "一二三四五 六七八".ToCharArray(); encoder.Convert(target, 0, target.Length, buff, 0, buff.Length, true, out charsUsed, out bytesUsed, out completed); Assert.AreEqual(15, bytesUsed); var result = encoding.GetString(buff, 0, bytesUsed); Assert.AreEqual("一二三四五 六七", result); } ```