private string TakeString(CharCodeType type, byte[] data, ref int offset, ref int take_pos) { var byte_num = 0; /* 文字の最初のデータを検索 */ while (offset < data.Length) { if (IsTopCharData(type, data[offset], ref byte_num)) { break; } offset++; } /* 有効なデータが見つからなかった場合は終了 */ if (offset == data.Length) { return(null); } /* 有効な文字が見つかってもデータが足りなければ終了 */ if ((offset + byte_num) > data.Length) { offset = data.Length; return(null); } /* 文字列に変換 */ var result = char_encoder_.GetString(data.Skip(offset).Take(byte_num).ToArray()); take_pos = offset; offset += byte_num; return(result); }
public void SetCharCode(CharCodeType type) { char_code_ = type; switch (type) { case CharCodeType.ASCII: char_encoder_ = Encoding.ASCII; break; case CharCodeType.ShiftJIS: char_encoder_ = Encoding.GetEncoding(932); break; case CharCodeType.UTF8: char_encoder_ = Encoding.UTF8; break; default: char_encoder_ = null; break; } ViewUpdate(); }
private bool IsTopCharData(CharCodeType type, byte data, ref int byte_num) { var result = false; switch (char_code_) { case CharCodeType.ASCII: { byte_num = 1; result = true; } break; case CharCodeType.ShiftJIS: { if (((data >= 0x81) && (data <= 0x9F)) || ((data >= 0xE0) && (data <= 0xFC)) ) { /* マルチバイトの1文字目 */ byte_num = 2; } else { /* 1バイト文字 */ byte_num = 1; } result = true; } break; case CharCodeType.UTF8: { if ((data & 0xFE) == 0xFC) { byte_num = 6; result = true; } else if ((data & 0xFC) == 0xF8) { byte_num = 5; result = true; } else if ((data & 0xF8) == 0xF0) { byte_num = 4; result = true; } else if ((data & 0xF0) == 0xE0) { byte_num = 3; result = true; } else if ((data & 0xE0) == 0xC0) { byte_num = 2; result = true; } else if ((data & 0x80) == 0x00) { byte_num = 1; result = true; } } break; } return(result); }