SurrogateChar.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.Text
  5. {
  6. using System.Globalization;
  7. using System.Runtime.Serialization; // Just for SR
  8. struct SurrogateChar
  9. {
  10. char lowChar;
  11. char highChar;
  12. public const int MinValue = 0x10000;
  13. public const int MaxValue = MinValue + (1 << 20) - 1;
  14. const char surHighMin = (char)0xd800;
  15. const char surHighMax = (char)0xdbff;
  16. const char surLowMin = (char)0xdc00;
  17. const char surLowMax = (char)0xdfff;
  18. public SurrogateChar(int ch)
  19. {
  20. if (ch < MinValue || ch > MaxValue)
  21. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.XmlInvalidSurrogate, ch.ToString("X", CultureInfo.InvariantCulture)), "ch"));
  22. const int mask = ((1 << 10) - 1);
  23. this.lowChar = (char)(((ch - MinValue) & mask) + surLowMin);
  24. this.highChar = (char)((((ch - MinValue) >> 10) & mask) + surHighMin);
  25. }
  26. public SurrogateChar(char lowChar, char highChar)
  27. {
  28. if (lowChar < surLowMin || lowChar > surLowMax)
  29. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.XmlInvalidLowSurrogate, ((int)lowChar).ToString("X", CultureInfo.InvariantCulture)), "lowChar"));
  30. if (highChar < surHighMin || highChar > surHighMax)
  31. throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.XmlInvalidHighSurrogate, ((int)highChar).ToString("X", CultureInfo.InvariantCulture)), "highChar"));
  32. this.lowChar = lowChar;
  33. this.highChar = highChar;
  34. }
  35. public char LowChar { get { return lowChar; } }
  36. public char HighChar { get { return highChar; } }
  37. public int Char
  38. {
  39. get
  40. {
  41. return (lowChar - surLowMin) | ((highChar - surHighMin) << 10) + MinValue;
  42. }
  43. }
  44. }
  45. }