ある意味、力業
UniCodeからshift-jisに文字変換して指定バイトで文字列を分割しますが
分割の最後が全角の判定を行い、文字化けしないようにする。
using System;
using System.Collections.Generic;
using System.Text;
var vList = new List<string>();
var wordList = text.Split(new[] { "\r\n", "\n", "\r" }, StringSplitOptions.None);
int vLoop, vStart, vLength;
int vSize = 101;
byte[] btBytes = null;
string strTemp = null;
bool vZenkaku;
Encoding hEncoding = Encoding.GetEncoding("Shift_JIS");
foreach (var item in wordList) {
btBytes = hEncoding.GetBytes(item);
vLength = btBytes.Length;
if (vLength > vSize) {
vLoop = (vLength + vSize) / vSize;
vStart = 0;
for (int j = 0; j < vLoop; j++) {
if ((vStart + vSize) < vLength) {
//最後の文字が漢字の左半分の場合、切出の先頭は泣き別れになる
vZenkaku = is_zenkaku(btBytes[vStart + vSize - 1]);
if (vZenkaku) {
strTemp = hEncoding.GetString(btBytes, vStart, (vSize - 1));
vStart = vStart + vSize - 1;
}
else {
strTemp = hEncoding.GetString(btBytes, vStart, vSize);
vStart = vStart + vSize;
}
vList.Add(strTemp);
}
else {
//vList.Add(item.Substring(vStart, (item.Length - vStart)));
vList.Add(hEncoding.GetString(btBytes, vStart, (vLength - vStart)));
}
}
}
else {
vList.Add(item);
}
}
foreach (var rec in vList) {
Console.WriteLine(rec);
}
}
// 全角判定(シフトJIS)
static private bool is_zenkaku(byte c) {
if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)) { // 全角の第1バイト
return true;
}
return false;
}
0 件のコメント:
コメントを投稿