Encoding.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:4k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: Encoding.cs,v 1.2 2005/04/20 08:45:46 okajima Exp $
  4. */
  5. using System;
  6. using System.Text;
  7. using Poderosa.ConnectionParam;
  8. using Poderosa.Toolkit;
  9. namespace Poderosa.Communication
  10. {
  11. //encoding娭學
  12. public abstract class EncodingProfile {
  13. private Encoding _encoding;
  14. private EncodingType _type;
  15. private byte[] _buffer;
  16. private int _cursor;
  17. private int _byte_len;
  18. protected EncodingProfile(EncodingType t, Encoding enc) {
  19. _type = t;
  20. _encoding = enc;
  21. _buffer = new byte[3]; //崱偼侾暥帤偼嵟戝俁僶僀僩
  22. _cursor = 0;
  23. }
  24. public abstract bool IsLeadByte(byte b);
  25. public abstract int  GetCharLength(byte b);
  26. public Encoding Encoding {
  27. get {
  28. return _encoding;
  29. }
  30. }
  31. public EncodingType Type {
  32. get {
  33. return _type;
  34. }
  35. }
  36. internal byte[] Buffer {
  37. get {
  38. return _buffer;
  39. }
  40. }
  41. internal byte[] GetBytes(char[] chars) {
  42. return _encoding.GetBytes(chars);
  43. }
  44. internal byte[] GetBytes(char ch) {
  45. char[] t = new char[1];
  46. t[0] = ch;
  47. return _encoding.GetBytes(t);
  48. }
  49. internal bool IsInterestingByte(byte b) {
  50. return _cursor==0? IsLeadByte(b) : b>=33; //"b>=33"偺偲偙傠偼傕偆偪傚偭偲傑偠傔偵敾掕偡傞傋偒
  51. }
  52. internal int Decode(byte[] data, char[] result) {
  53. return _encoding.GetChars(data, 0, data.Length, result, 0);
  54. }
  55. internal void Reset() {
  56. _cursor = 0;
  57. _byte_len = 0;
  58. }
  59. //侾僶僀僩傪捛壛偡傞丅暥帤偑姰惉偡傟偽僨僐乕僪偟偰偦偺暥帤傪曉偡丅傑偩懕偒偺僶僀僩偑昁梫側傜傪曉偡
  60. internal char PutByte(byte b) {
  61. if(_cursor==0)
  62. _byte_len = GetCharLength(b);
  63. _buffer[_cursor++] = b;
  64. if(_cursor==_byte_len) {
  65. char[] result = new Char[1];
  66. _encoding.GetChars(_buffer, 0, _byte_len, result, 0);
  67. _cursor = 0;
  68. return result[0];
  69. }
  70. return '';
  71. }
  72. public static EncodingProfile Get(EncodingType et) {
  73. EncodingProfile p = null;
  74. switch(et) {
  75. case EncodingType.ISO8859_1:
  76. p = new ISO8859_1Profile();
  77. break;
  78. case EncodingType.EUC_JP:
  79. p = new EUCJPProfile();
  80. break;
  81. case EncodingType.SHIFT_JIS:
  82. p = new ShiftJISProfile();
  83. break;
  84. case EncodingType.UTF8:
  85. p = new UTF8Profile();
  86. break;
  87. }
  88. return p;
  89. }
  90. class ISO8859_1Profile : EncodingProfile {
  91. public ISO8859_1Profile() : base(EncodingType.ISO8859_1, Encoding.GetEncoding("iso-8859-1")) {
  92. }
  93. public override int GetCharLength(byte b) {
  94. return 1;
  95. }
  96. public override bool IsLeadByte(byte b) {
  97. return b>=0xA0 && b<=0xFE;
  98. }
  99. }
  100. class ShiftJISProfile : EncodingProfile {
  101. public ShiftJISProfile() : base(EncodingType.SHIFT_JIS, Encoding.GetEncoding("shift_jis")) {
  102. }
  103. public override int GetCharLength(byte b) {
  104. return (b>=0xA1 && b<=0xDF)? 1 : 2;
  105. }
  106. public override bool IsLeadByte(byte b) {
  107. return b>=0x81 && b<=0xFC;
  108. }
  109. }
  110. class EUCJPProfile : EncodingProfile {
  111. public EUCJPProfile() : base(EncodingType.EUC_JP, Encoding.GetEncoding("euc-jp")) {
  112. }
  113. public override int GetCharLength(byte b) {
  114. return b==0x8F? 3 : b>=0x8E? 2 : 1;
  115. }
  116. public override bool IsLeadByte(byte b) {
  117. return b>=0x8E && b<=0xFE;
  118. }
  119. }
  120. class UTF8Profile : EncodingProfile {
  121. public UTF8Profile() : base(EncodingType.UTF8, Encoding.UTF8) {
  122. }
  123. public override int GetCharLength(byte b) {
  124. return b>=0xE0? 3 : b>=0x80? 2 : 1;
  125. }
  126. public override bool IsLeadByte(byte b) {
  127. return b>=0x80;
  128. }
  129. }
  130. }
  131. }