UTFConvert.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // UTFConvert.cpp
  2. #include "StdAfx.h"
  3. #include "UTFConvert.h"
  4. #include "Types.h"
  5. static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
  6. // These functions are for UTF8 <-> UTF16 conversion.
  7. bool ConvertUTF8ToUnicode(const AString &src, UString &dest)
  8. {
  9. dest.Empty();
  10. for(int i = 0; i < src.Length();)
  11. {
  12. Byte c = (Byte)src[i++];
  13. if (c < 0x80)
  14. {
  15. dest += (wchar_t)c;
  16. continue;
  17. }
  18. if(c < 0xC0)
  19. return false;
  20. int numAdds;
  21. for (numAdds = 1; numAdds < 5; numAdds++)
  22. if (c < kUtf8Limits[numAdds])
  23. break;
  24. UInt32 value = (c - kUtf8Limits[numAdds - 1]);
  25. do
  26. {
  27. if (i >= src.Length())
  28. return false;
  29. Byte c2 = (Byte)src[i++];
  30. if (c2 < 0x80 || c2 >= 0xC0)
  31. return false;
  32. value <<= 6;
  33. value |= (c2 - 0x80);
  34. numAdds--;
  35. }
  36. while(numAdds > 0);
  37. if (value < 0x10000)
  38. dest += (wchar_t)(value);
  39. else
  40. {
  41. value -= 0x10000;
  42. if (value >= 0x100000)
  43. return false;
  44. dest += (wchar_t)(0xD800 + (value >> 10));
  45. dest += (wchar_t)(0xDC00 + (value & 0x3FF));
  46. }
  47. }
  48. return true;
  49. }
  50. bool ConvertUnicodeToUTF8(const UString &src, AString &dest)
  51. {
  52. dest.Empty();
  53. for(int i = 0; i < src.Length();)
  54. {
  55. UInt32 value = (UInt32)src[i++];
  56. if (value < 0x80)
  57. {
  58. dest += (char)value;
  59. continue;
  60. }
  61. if (value >= 0xD800 && value < 0xE000)
  62. {
  63. if (value >= 0xDC00)
  64. return false;
  65. if (i >= src.Length())
  66. return false;
  67. UInt32 c2 = (UInt32)src[i++];
  68. if (c2 < 0xDC00 || c2 >= 0xE000)
  69. return false;
  70. value = ((value - 0xD800) << 10) | (c2 - 0xDC00);
  71. }
  72. int numAdds;
  73. for (numAdds = 1; numAdds < 5; numAdds++)
  74. if (value < (((UInt32)1) << (numAdds * 5 + 6)))
  75. break;
  76. dest += (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds)));
  77. do
  78. {
  79. numAdds--;
  80. dest += (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F));
  81. }
  82. while(numAdds > 0);
  83. }
  84. return true;
  85. }