Fixed some problem with encoding multi-byte character sets (was previously a single-byte only), still doesn't work well

This commit is contained in:
Michael Becker 2014-06-25 09:05:54 -04:00
parent 8b39c0563e
commit 428ca2d65b
2 changed files with 134 additions and 2 deletions

View File

@ -92,7 +92,33 @@ namespace UniversalEditor.IO
return GetChars(bytes, 0, bytes.Length);
}
public abstract char[] GetChars(byte[] bytes, int index, int count);
}
public virtual int GetMaxByteCount(int count)
{
return count;
}
public virtual int GetMaxCharCount(int count)
{
return count;
}
public virtual int GetByteCount(char[] chars, int index, int count)
{
return 1;
}
public int GetByteCount(char value)
{
return GetByteCount(new char[] { value }, 0, 1);
}
public int GetByteCount(char[] chars)
{
return GetByteCount(chars, 0, chars.Length);
}
public int GetByteCount(string value)
{
char[] chars = value.ToCharArray();
return GetByteCount(chars, 0, chars.Length);
}
}
public class DefaultEncoding : Encoding
{
public override byte[] GetBytes(char[] chars, int index, int count)
@ -126,6 +152,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class UTF16BigEndianEncoding : Encoding
{
@ -139,6 +177,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class UTF16LittleEndianEncoding : Encoding
{
@ -152,6 +202,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class UTF32Encoding : Encoding
{
@ -165,6 +227,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class UTF7Encoding : Encoding
{
@ -178,6 +252,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class UTF8Encoding : Encoding
{
@ -191,6 +277,18 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
public class ShiftJISEncoding : Encoding
{
@ -204,5 +302,17 @@ namespace UniversalEditor.IO
{
return _encoding.GetChars(bytes, index, count);
}
public override int GetMaxByteCount(int count)
{
return _encoding.GetMaxByteCount(count);
}
public override int GetMaxCharCount(int count)
{
return _encoding.GetMaxCharCount(count);
}
public override int GetByteCount(char[] chars, int index, int count)
{
return _encoding.GetByteCount(chars, index, count);
}
}
}

View File

@ -81,9 +81,31 @@ namespace UniversalEditor.IO
{
return ReadBytes(1)[0];
}
string charBuffer = null;
int charBufferIndex = 0;
public char ReadChar()
{
return (char)ReadByte();
if (charBuffer == null)
{
int maxByteCount = mvarAccessor.DefaultEncoding.GetMaxByteCount(1);
byte[] bytes = PeekBytes(maxByteCount);
charBuffer = mvarAccessor.DefaultEncoding.GetString(bytes);
charBufferIndex = 0;
}
char c = charBuffer[charBufferIndex];
charBufferIndex++;
int ct = mvarAccessor.DefaultEncoding.GetByteCount(c);
Seek(ct, SeekOrigin.Current);
if (charBufferIndex + 1 > charBuffer.Length)
{
charBuffer = null;
}
return c;
}
public byte PeekByte()
{