2
0

unicode_convertUTF8.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. Object.defineProperty(Object.getPrototypeOf({}), "echo", { value: function () { WScript.Echo(this); } });
  6. Object.defineProperty(Object.getPrototypeOf({}), "echos", { value: function () { WScript.Echo(JSON.stringify(this)); } });
  7. function AssertEqual(actual, expected, msg) { ((actual === expected ? "Passed! " : "Failed (actual: " + actual + ", expected: " + expected + "). Message: ") + msg).echo(); };
  8. Object.defineProperty(Object.getPrototypeOf({}), "equalTo", { value: function (other, msg) { AssertEqual(this.constructor(this), other, msg); } });
  9. // Range: Bit Mask:
  10. // 0x000000 - 0x00007F 0xxxxxxx 0 - 128
  11. // 0x000080 - 0x0007FF 110xxxxx 10xxxxxx 49280 - 65535
  12. // 0x000800 - 0x00FFFF 1110xxxx 10xxxxxx 10xxxxxx 14712960 - 33554431
  13. // 0x010000 - 0x1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx -260013952 - -1
  14. var strArr = Array(400000);
  15. for (var j = 0; j < 100000; j++) {
  16. var val = Math.floor(Math.random() * 0x7F);
  17. strArr[j] = String.fromCodePoint(val);
  18. }
  19. for (; j < 200000; j++) {
  20. var val = Math.floor(Math.random() * 0x77F) + 0x80;
  21. strArr[j] = String.fromCodePoint(val);
  22. }
  23. for (; j < 300000; j++) {
  24. var val = Math.floor(Math.random() * 0xF7FF) + 0x800;
  25. strArr[j] = String.fromCodePoint(val);
  26. }
  27. for (; j < 400000; j++) {
  28. var val = Math.floor(Math.random() * 0x0FFFFF) + 0x010000;
  29. strArr[j] = String.fromCodePoint(val);
  30. }
  31. var str = strArr.join('');
  32. var output = "";
  33. var utf8 = [];
  34. var i = 0;
  35. var start = Date.now();
  36. while (i < str.length) {
  37. var codePoint = str.codePointAt(i);
  38. utf8.push(convertUTF16ValueToUTF8(codePoint));
  39. i += (codePoint >= 0x10000 ? 2 : 1);
  40. }
  41. for (var i = 0; i < utf8.length; i++) {
  42. var item = utf8[i];
  43. var codePoint = convertUTF8ValueToUTF16(item);
  44. if (String.fromCodePoint(codePoint).length > 2) codePoint.echo();
  45. output += String.fromCodePoint(codePoint);
  46. }
  47. var total = Date.now() - start;
  48. if (output === str) {
  49. // total.echo();
  50. "Pass".echo();
  51. } else {
  52. "Failed!".echo();
  53. }
  54. function convertUTF16ValueToUTF8(value) {
  55. if (value < 0x80) return value;
  56. if (value < 0x800) return (((value >> 6) + 0xC0 /* 11000000 */) << 8) + (value & 0x3F) + 0x80;
  57. if (value < 0x10000) return (((value >> 12) + 0xE0 /* 11100000 */) << 16) + ((((value >> 6) & 0x3F) + 0x80) << 8) + (value & 0x3F) + 0x80;
  58. if (value < 0x200000) return (((value >> 18) + 0xF0 /* 11100000 */) << 24) + ((((value >> 12) & 0x3F) + 0x80) << 16) + ((((value >> 6) & 0x3F) + 0x80) << 8) + (value & 0x3F) + 0x80;
  59. }
  60. function convertUTF8ValueToUTF16(value) {
  61. if (value <= -1 && value >= -260013952) return (((value >> 24) & 0x7) << 18) + (((value >> 16) & 0x3F) << 12) + (((value >> 8) & 0x3F) << 6) + (value & 0x3F);
  62. if (value <= 127 && value >= 0) return value;
  63. if (value <= 65535 && value >= 49280) return (((value >> 8) & 0x1F) << 6) + (value & 0x3F);
  64. if (value <= 33554431 && value >= 14712960) return (((value >> 16) & 0xF) << 12) + (((value >> 8) & 0x3F) << 6) + (value & 0x3F);
  65. throw new Error(value);
  66. }