teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記追加

2017/11/18 01:46

投稿

退会済みユーザー
answer CHANGED
@@ -6,4 +6,22 @@
6
6
 
7
7
  なので、$enc.getstring($bytes, 0, 16) が "一二三四五 六七・" になるのは当然の結果('八' は 2 バイトなのに 1 バイトしか出力されないので文字化け)だと思いますが。
8
8
 
9
- 一体何がしたいのでしょう?
9
+ 一体何がしたいのでしょう?
10
+
11
+ **【追記】**
12
+
13
+ 質問を読み直して ↓ こういうことではないかと思ったのですが?(大前提として、ホントに Shift_JIS を考えればよいのかという疑問がありますが、そこはちょっと置いといて・・・)
14
+
15
+ (1) Shift_JIS コードのバイト列がある。内容と長さは不定。Shift_JIS として不正なコードは入ってない。
16
+
17
+ (2) そのバイト列から最大 16 バイトを文字列に変換して出力したい。
18
+
19
+ (3) ただし、上記 (1) のバイト列が 16 バイトを超える場合で、かつ最後の 16 バイト目が Shift_JIS の 2 バイト文字(いわゆる全角文字)の第 1 バイトの場合は、バイト列の 15 バイトまでを文字列に変換して出力したい。
20
+
21
+ 上記の理解が違う場合はどこがどう違うか指摘してください。
22
+
23
+ 理解が合っていれば、PowerShell で書けるのかどうかわかりませんが、(3) ができるようなコードを書くということになります。
24
+
25
+ 具体的には、2 バイト文字の第 1 バイトは 16 進数で 80 以上なので、(1) のバイト列を先頭からスキャンして行って、16 バイト目が 1 バイト文字(いわゆる半角)か 2 バイト文字の第 1 バイトなのかを調べて処置するということになります。
26
+
27
+ なお、16 バイト目だけ見たのではダメです。必ずバイト列の先頭からスキャンして調べていく必要があります。また、Shift_JIS として不正なコードは入ってないことが条件になります。