unicode_v11.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. import 'dart:typed_data';
  2. const BMP_COMBINING = [
  3. [0x0300, 0x036F],
  4. [0x0483, 0x0489],
  5. [0x0591, 0x05BD],
  6. [0x05BF, 0x05BF],
  7. [0x05C1, 0x05C2],
  8. [0x05C4, 0x05C5],
  9. [0x05C7, 0x05C7],
  10. [0x0600, 0x0605],
  11. [0x0610, 0x061A],
  12. [0x061C, 0x061C],
  13. [0x064B, 0x065F],
  14. [0x0670, 0x0670],
  15. [0x06D6, 0x06DD],
  16. [0x06DF, 0x06E4],
  17. [0x06E7, 0x06E8],
  18. [0x06EA, 0x06ED],
  19. [0x070F, 0x070F],
  20. [0x0711, 0x0711],
  21. [0x0730, 0x074A],
  22. [0x07A6, 0x07B0],
  23. [0x07EB, 0x07F3],
  24. [0x07FD, 0x07FD],
  25. [0x0816, 0x0819],
  26. [0x081B, 0x0823],
  27. [0x0825, 0x0827],
  28. [0x0829, 0x082D],
  29. [0x0859, 0x085B],
  30. [0x08D3, 0x0902],
  31. [0x093A, 0x093A],
  32. [0x093C, 0x093C],
  33. [0x0941, 0x0948],
  34. [0x094D, 0x094D],
  35. [0x0951, 0x0957],
  36. [0x0962, 0x0963],
  37. [0x0981, 0x0981],
  38. [0x09BC, 0x09BC],
  39. [0x09C1, 0x09C4],
  40. [0x09CD, 0x09CD],
  41. [0x09E2, 0x09E3],
  42. [0x09FE, 0x09FE],
  43. [0x0A01, 0x0A02],
  44. [0x0A3C, 0x0A3C],
  45. [0x0A41, 0x0A42],
  46. [0x0A47, 0x0A48],
  47. [0x0A4B, 0x0A4D],
  48. [0x0A51, 0x0A51],
  49. [0x0A70, 0x0A71],
  50. [0x0A75, 0x0A75],
  51. [0x0A81, 0x0A82],
  52. [0x0ABC, 0x0ABC],
  53. [0x0AC1, 0x0AC5],
  54. [0x0AC7, 0x0AC8],
  55. [0x0ACD, 0x0ACD],
  56. [0x0AE2, 0x0AE3],
  57. [0x0AFA, 0x0AFF],
  58. [0x0B01, 0x0B01],
  59. [0x0B3C, 0x0B3C],
  60. [0x0B3F, 0x0B3F],
  61. [0x0B41, 0x0B44],
  62. [0x0B4D, 0x0B4D],
  63. [0x0B56, 0x0B56],
  64. [0x0B62, 0x0B63],
  65. [0x0B82, 0x0B82],
  66. [0x0BC0, 0x0BC0],
  67. [0x0BCD, 0x0BCD],
  68. [0x0C00, 0x0C00],
  69. [0x0C04, 0x0C04],
  70. [0x0C3E, 0x0C40],
  71. [0x0C46, 0x0C48],
  72. [0x0C4A, 0x0C4D],
  73. [0x0C55, 0x0C56],
  74. [0x0C62, 0x0C63],
  75. [0x0C81, 0x0C81],
  76. [0x0CBC, 0x0CBC],
  77. [0x0CBF, 0x0CBF],
  78. [0x0CC6, 0x0CC6],
  79. [0x0CCC, 0x0CCD],
  80. [0x0CE2, 0x0CE3],
  81. [0x0D00, 0x0D01],
  82. [0x0D3B, 0x0D3C],
  83. [0x0D41, 0x0D44],
  84. [0x0D4D, 0x0D4D],
  85. [0x0D62, 0x0D63],
  86. [0x0DCA, 0x0DCA],
  87. [0x0DD2, 0x0DD4],
  88. [0x0DD6, 0x0DD6],
  89. [0x0E31, 0x0E31],
  90. [0x0E34, 0x0E3A],
  91. [0x0E47, 0x0E4E],
  92. [0x0EB1, 0x0EB1],
  93. [0x0EB4, 0x0EBC],
  94. [0x0EC8, 0x0ECD],
  95. [0x0F18, 0x0F19],
  96. [0x0F35, 0x0F35],
  97. [0x0F37, 0x0F37],
  98. [0x0F39, 0x0F39],
  99. [0x0F71, 0x0F7E],
  100. [0x0F80, 0x0F84],
  101. [0x0F86, 0x0F87],
  102. [0x0F8D, 0x0F97],
  103. [0x0F99, 0x0FBC],
  104. [0x0FC6, 0x0FC6],
  105. [0x102D, 0x1030],
  106. [0x1032, 0x1037],
  107. [0x1039, 0x103A],
  108. [0x103D, 0x103E],
  109. [0x1058, 0x1059],
  110. [0x105E, 0x1060],
  111. [0x1071, 0x1074],
  112. [0x1082, 0x1082],
  113. [0x1085, 0x1086],
  114. [0x108D, 0x108D],
  115. [0x109D, 0x109D],
  116. [0x1160, 0x11FF],
  117. [0x135D, 0x135F],
  118. [0x1712, 0x1714],
  119. [0x1732, 0x1734],
  120. [0x1752, 0x1753],
  121. [0x1772, 0x1773],
  122. [0x17B4, 0x17B5],
  123. [0x17B7, 0x17BD],
  124. [0x17C6, 0x17C6],
  125. [0x17C9, 0x17D3],
  126. [0x17DD, 0x17DD],
  127. [0x180B, 0x180E],
  128. [0x1885, 0x1886],
  129. [0x18A9, 0x18A9],
  130. [0x1920, 0x1922],
  131. [0x1927, 0x1928],
  132. [0x1932, 0x1932],
  133. [0x1939, 0x193B],
  134. [0x1A17, 0x1A18],
  135. [0x1A1B, 0x1A1B],
  136. [0x1A56, 0x1A56],
  137. [0x1A58, 0x1A5E],
  138. [0x1A60, 0x1A60],
  139. [0x1A62, 0x1A62],
  140. [0x1A65, 0x1A6C],
  141. [0x1A73, 0x1A7C],
  142. [0x1A7F, 0x1A7F],
  143. [0x1AB0, 0x1ABE],
  144. [0x1B00, 0x1B03],
  145. [0x1B34, 0x1B34],
  146. [0x1B36, 0x1B3A],
  147. [0x1B3C, 0x1B3C],
  148. [0x1B42, 0x1B42],
  149. [0x1B6B, 0x1B73],
  150. [0x1B80, 0x1B81],
  151. [0x1BA2, 0x1BA5],
  152. [0x1BA8, 0x1BA9],
  153. [0x1BAB, 0x1BAD],
  154. [0x1BE6, 0x1BE6],
  155. [0x1BE8, 0x1BE9],
  156. [0x1BED, 0x1BED],
  157. [0x1BEF, 0x1BF1],
  158. [0x1C2C, 0x1C33],
  159. [0x1C36, 0x1C37],
  160. [0x1CD0, 0x1CD2],
  161. [0x1CD4, 0x1CE0],
  162. [0x1CE2, 0x1CE8],
  163. [0x1CED, 0x1CED],
  164. [0x1CF4, 0x1CF4],
  165. [0x1CF8, 0x1CF9],
  166. [0x1DC0, 0x1DF9],
  167. [0x1DFB, 0x1DFF],
  168. [0x200B, 0x200F],
  169. [0x202A, 0x202E],
  170. [0x2060, 0x2064],
  171. [0x2066, 0x206F],
  172. [0x20D0, 0x20F0],
  173. [0x2CEF, 0x2CF1],
  174. [0x2D7F, 0x2D7F],
  175. [0x2DE0, 0x2DFF],
  176. [0x302A, 0x302D],
  177. [0x3099, 0x309A],
  178. [0xA66F, 0xA672],
  179. [0xA674, 0xA67D],
  180. [0xA69E, 0xA69F],
  181. [0xA6F0, 0xA6F1],
  182. [0xA802, 0xA802],
  183. [0xA806, 0xA806],
  184. [0xA80B, 0xA80B],
  185. [0xA825, 0xA826],
  186. [0xA8C4, 0xA8C5],
  187. [0xA8E0, 0xA8F1],
  188. [0xA8FF, 0xA8FF],
  189. [0xA926, 0xA92D],
  190. [0xA947, 0xA951],
  191. [0xA980, 0xA982],
  192. [0xA9B3, 0xA9B3],
  193. [0xA9B6, 0xA9B9],
  194. [0xA9BC, 0xA9BD],
  195. [0xA9E5, 0xA9E5],
  196. [0xAA29, 0xAA2E],
  197. [0xAA31, 0xAA32],
  198. [0xAA35, 0xAA36],
  199. [0xAA43, 0xAA43],
  200. [0xAA4C, 0xAA4C],
  201. [0xAA7C, 0xAA7C],
  202. [0xAAB0, 0xAAB0],
  203. [0xAAB2, 0xAAB4],
  204. [0xAAB7, 0xAAB8],
  205. [0xAABE, 0xAABF],
  206. [0xAAC1, 0xAAC1],
  207. [0xAAEC, 0xAAED],
  208. [0xAAF6, 0xAAF6],
  209. [0xABE5, 0xABE5],
  210. [0xABE8, 0xABE8],
  211. [0xABED, 0xABED],
  212. [0xFB1E, 0xFB1E],
  213. [0xFE00, 0xFE0F],
  214. [0xFE20, 0xFE2F],
  215. [0xFEFF, 0xFEFF],
  216. [0xFFF9, 0xFFFB]
  217. ];
  218. const HIGH_COMBINING = [
  219. [0x101FD, 0x101FD],
  220. [0x102E0, 0x102E0],
  221. [0x10376, 0x1037A],
  222. [0x10A01, 0x10A03],
  223. [0x10A05, 0x10A06],
  224. [0x10A0C, 0x10A0F],
  225. [0x10A38, 0x10A3A],
  226. [0x10A3F, 0x10A3F],
  227. [0x10AE5, 0x10AE6],
  228. [0x10D24, 0x10D27],
  229. [0x10F46, 0x10F50],
  230. [0x11001, 0x11001],
  231. [0x11038, 0x11046],
  232. [0x1107F, 0x11081],
  233. [0x110B3, 0x110B6],
  234. [0x110B9, 0x110BA],
  235. [0x110BD, 0x110BD],
  236. [0x110CD, 0x110CD],
  237. [0x11100, 0x11102],
  238. [0x11127, 0x1112B],
  239. [0x1112D, 0x11134],
  240. [0x11173, 0x11173],
  241. [0x11180, 0x11181],
  242. [0x111B6, 0x111BE],
  243. [0x111C9, 0x111CC],
  244. [0x1122F, 0x11231],
  245. [0x11234, 0x11234],
  246. [0x11236, 0x11237],
  247. [0x1123E, 0x1123E],
  248. [0x112DF, 0x112DF],
  249. [0x112E3, 0x112EA],
  250. [0x11300, 0x11301],
  251. [0x1133B, 0x1133C],
  252. [0x11340, 0x11340],
  253. [0x11366, 0x1136C],
  254. [0x11370, 0x11374],
  255. [0x11438, 0x1143F],
  256. [0x11442, 0x11444],
  257. [0x11446, 0x11446],
  258. [0x1145E, 0x1145E],
  259. [0x114B3, 0x114B8],
  260. [0x114BA, 0x114BA],
  261. [0x114BF, 0x114C0],
  262. [0x114C2, 0x114C3],
  263. [0x115B2, 0x115B5],
  264. [0x115BC, 0x115BD],
  265. [0x115BF, 0x115C0],
  266. [0x115DC, 0x115DD],
  267. [0x11633, 0x1163A],
  268. [0x1163D, 0x1163D],
  269. [0x1163F, 0x11640],
  270. [0x116AB, 0x116AB],
  271. [0x116AD, 0x116AD],
  272. [0x116B0, 0x116B5],
  273. [0x116B7, 0x116B7],
  274. [0x1171D, 0x1171F],
  275. [0x11722, 0x11725],
  276. [0x11727, 0x1172B],
  277. [0x1182F, 0x11837],
  278. [0x11839, 0x1183A],
  279. [0x119D4, 0x119D7],
  280. [0x119DA, 0x119DB],
  281. [0x119E0, 0x119E0],
  282. [0x11A01, 0x11A0A],
  283. [0x11A33, 0x11A38],
  284. [0x11A3B, 0x11A3E],
  285. [0x11A47, 0x11A47],
  286. [0x11A51, 0x11A56],
  287. [0x11A59, 0x11A5B],
  288. [0x11A8A, 0x11A96],
  289. [0x11A98, 0x11A99],
  290. [0x11C30, 0x11C36],
  291. [0x11C38, 0x11C3D],
  292. [0x11C3F, 0x11C3F],
  293. [0x11C92, 0x11CA7],
  294. [0x11CAA, 0x11CB0],
  295. [0x11CB2, 0x11CB3],
  296. [0x11CB5, 0x11CB6],
  297. [0x11D31, 0x11D36],
  298. [0x11D3A, 0x11D3A],
  299. [0x11D3C, 0x11D3D],
  300. [0x11D3F, 0x11D45],
  301. [0x11D47, 0x11D47],
  302. [0x11D90, 0x11D91],
  303. [0x11D95, 0x11D95],
  304. [0x11D97, 0x11D97],
  305. [0x11EF3, 0x11EF4],
  306. [0x13430, 0x13438],
  307. [0x16AF0, 0x16AF4],
  308. [0x16B30, 0x16B36],
  309. [0x16F4F, 0x16F4F],
  310. [0x16F8F, 0x16F92],
  311. [0x1BC9D, 0x1BC9E],
  312. [0x1BCA0, 0x1BCA3],
  313. [0x1D167, 0x1D169],
  314. [0x1D173, 0x1D182],
  315. [0x1D185, 0x1D18B],
  316. [0x1D1AA, 0x1D1AD],
  317. [0x1D242, 0x1D244],
  318. [0x1DA00, 0x1DA36],
  319. [0x1DA3B, 0x1DA6C],
  320. [0x1DA75, 0x1DA75],
  321. [0x1DA84, 0x1DA84],
  322. [0x1DA9B, 0x1DA9F],
  323. [0x1DAA1, 0x1DAAF],
  324. [0x1E000, 0x1E006],
  325. [0x1E008, 0x1E018],
  326. [0x1E01B, 0x1E021],
  327. [0x1E023, 0x1E024],
  328. [0x1E026, 0x1E02A],
  329. [0x1E130, 0x1E136],
  330. [0x1E2EC, 0x1E2EF],
  331. [0x1E8D0, 0x1E8D6],
  332. [0x1E944, 0x1E94A],
  333. [0xE0001, 0xE0001],
  334. [0xE0020, 0xE007F],
  335. [0xE0100, 0xE01EF]
  336. ];
  337. const BMP_WIDE = [
  338. [0x1100, 0x115F],
  339. [0x231A, 0x231B],
  340. [0x2329, 0x232A],
  341. [0x23E9, 0x23EC],
  342. [0x23F0, 0x23F0],
  343. [0x23F3, 0x23F3],
  344. [0x25FD, 0x25FE],
  345. [0x2614, 0x2615],
  346. [0x2648, 0x2653],
  347. [0x267F, 0x267F],
  348. [0x2693, 0x2693],
  349. [0x26A1, 0x26A1],
  350. [0x26AA, 0x26AB],
  351. [0x26BD, 0x26BE],
  352. [0x26C4, 0x26C5],
  353. [0x26CE, 0x26CE],
  354. [0x26D4, 0x26D4],
  355. [0x26EA, 0x26EA],
  356. [0x26F2, 0x26F3],
  357. [0x26F5, 0x26F5],
  358. [0x26FA, 0x26FA],
  359. [0x26FD, 0x26FD],
  360. [0x2705, 0x2705],
  361. [0x270A, 0x270B],
  362. [0x2728, 0x2728],
  363. [0x274C, 0x274C],
  364. [0x274E, 0x274E],
  365. [0x2753, 0x2755],
  366. [0x2757, 0x2757],
  367. [0x2795, 0x2797],
  368. [0x27B0, 0x27B0],
  369. [0x27BF, 0x27BF],
  370. [0x2B1B, 0x2B1C],
  371. [0x2B50, 0x2B50],
  372. [0x2B55, 0x2B55],
  373. [0x2E80, 0x2E99],
  374. [0x2E9B, 0x2EF3],
  375. [0x2F00, 0x2FD5],
  376. [0x2FF0, 0x2FFB],
  377. [0x3000, 0x3029],
  378. [0x302E, 0x303E],
  379. [0x3041, 0x3096],
  380. [0x309B, 0x30FF],
  381. [0x3105, 0x312F],
  382. [0x3131, 0x318E],
  383. [0x3190, 0x31BA],
  384. [0x31C0, 0x31E3],
  385. [0x31F0, 0x321E],
  386. [0x3220, 0x3247],
  387. [0x3250, 0x4DBF],
  388. [0x4E00, 0xA48C],
  389. [0xA490, 0xA4C6],
  390. [0xA960, 0xA97C],
  391. [0xAC00, 0xD7A3],
  392. [0xF900, 0xFAFF],
  393. [0xFE10, 0xFE19],
  394. [0xFE30, 0xFE52],
  395. [0xFE54, 0xFE66],
  396. [0xFE68, 0xFE6B],
  397. [0xFF01, 0xFF60],
  398. [0xFFE0, 0xFFE6]
  399. ];
  400. const HIGH_WIDE = [
  401. [0x16FE0, 0x16FE3],
  402. [0x17000, 0x187F7],
  403. [0x18800, 0x18AF2],
  404. [0x1B000, 0x1B11E],
  405. [0x1B150, 0x1B152],
  406. [0x1B164, 0x1B167],
  407. [0x1B170, 0x1B2FB],
  408. [0x1F004, 0x1F004],
  409. [0x1F0CF, 0x1F0CF],
  410. [0x1F18E, 0x1F18E],
  411. [0x1F191, 0x1F19A],
  412. [0x1F200, 0x1F202],
  413. [0x1F210, 0x1F23B],
  414. [0x1F240, 0x1F248],
  415. [0x1F250, 0x1F251],
  416. [0x1F260, 0x1F265],
  417. [0x1F300, 0x1F320],
  418. [0x1F32D, 0x1F335],
  419. [0x1F337, 0x1F37C],
  420. [0x1F37E, 0x1F393],
  421. [0x1F3A0, 0x1F3CA],
  422. [0x1F3CF, 0x1F3D3],
  423. [0x1F3E0, 0x1F3F0],
  424. [0x1F3F4, 0x1F3F4],
  425. [0x1F3F8, 0x1F43E],
  426. [0x1F440, 0x1F440],
  427. [0x1F442, 0x1F4FC],
  428. [0x1F4FF, 0x1F53D],
  429. [0x1F54B, 0x1F54E],
  430. [0x1F550, 0x1F567],
  431. [0x1F57A, 0x1F57A],
  432. [0x1F595, 0x1F596],
  433. [0x1F5A4, 0x1F5A4],
  434. [0x1F5FB, 0x1F64F],
  435. [0x1F680, 0x1F6C5],
  436. [0x1F6CC, 0x1F6CC],
  437. [0x1F6D0, 0x1F6D2],
  438. [0x1F6D5, 0x1F6D5],
  439. [0x1F6EB, 0x1F6EC],
  440. [0x1F6F4, 0x1F6FA],
  441. [0x1F7E0, 0x1F7EB],
  442. [0x1F90D, 0x1F971],
  443. [0x1F973, 0x1F976],
  444. [0x1F97A, 0x1F9A2],
  445. [0x1F9A5, 0x1F9AA],
  446. [0x1F9AE, 0x1F9CA],
  447. [0x1F9CD, 0x1F9FF],
  448. [0x1FA70, 0x1FA73],
  449. [0x1FA78, 0x1FA7A],
  450. [0x1FA80, 0x1FA82],
  451. [0x1FA90, 0x1FA95],
  452. [0x20000, 0x2FFFD],
  453. [0x30000, 0x3FFFD]
  454. ];
  455. final table = buildTable();
  456. Uint8List buildTable() {
  457. final table = Uint8List(65536);
  458. table.fillRange(0, table.length, 1);
  459. table[0] = 0;
  460. table.fillRange(1, 32, 0);
  461. table.fillRange(0x7f, 0xa0, 0);
  462. for (var r = 0; r < BMP_COMBINING.length; ++r) {
  463. table.fillRange(BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1, 0);
  464. }
  465. for (var r = 0; r < BMP_WIDE.length; ++r) {
  466. table.fillRange(BMP_WIDE[r][0], BMP_WIDE[r][1] + 1, 2);
  467. }
  468. return table;
  469. }
  470. bool bisearch(int ucs, List<List<int>> data) {
  471. var min = 0;
  472. var max = data.length - 1;
  473. var mid;
  474. if (ucs < data[0][0] || ucs > data[max][1]) {
  475. return false;
  476. }
  477. while (max >= min) {
  478. mid = (min + max) >> 1;
  479. if (ucs > data[mid][1]) {
  480. min = mid + 1;
  481. } else if (ucs < data[mid][0]) {
  482. max = mid - 1;
  483. } else {
  484. return true;
  485. }
  486. }
  487. return false;
  488. }
  489. class UnicodeV11 {
  490. final version = '11';
  491. int wcwidth(int codePoint) {
  492. if (codePoint < 32) return 0;
  493. if (codePoint < 127) return 1;
  494. if (codePoint < 65536) return table[codePoint];
  495. if (bisearch(codePoint, HIGH_COMBINING)) return 0;
  496. if (bisearch(codePoint, HIGH_WIDE)) return 2;
  497. return 1;
  498. }
  499. }
  500. final unicodeV11 = UnicodeV11();