vtwidecharwidth.pas 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. {
  2. Double Commander
  3. -------------------------------------------------------------------------
  4. This is a pascal implementation of wcwidth() function
  5. Copyright (C) 2022 Alexander Koblov ([email protected])
  6. Based on https://github.com/termux/wcwidth
  7. Copyright (c) 2016 Fredrik Fornwall <[email protected]>
  8. Based on https://github.com/jquast/wcwidth
  9. Copyright (c) 2014 Jeff Quast <[email protected]>
  10. Permission is hereby granted, free of charge, to any person obtaining
  11. a copy of this software and associated documentation files (the
  12. "Software"), to deal in the Software without restriction, including
  13. without limitation the rights to use, copy, modify, merge, publish,
  14. distribute, sublicense, and/or sell copies of the Software, and to
  15. permit persons to whom the Software is furnished to do so, subject to
  16. the following conditions:
  17. The above copyright notice and this permission notice shall be included
  18. in all copies or substantial portions of the Software.
  19. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  20. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  21. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  22. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  23. CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  24. TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  25. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  26. Markus Kuhn -- 2007-05-26 (Unicode 5.0)
  27. Permission to use, copy, modify, and distribute this software
  28. for any purpose and without fee is hereby granted. The author
  29. disclaims all warranties with regard to this software.
  30. }
  31. unit VTWideCharWidth;
  32. {$mode objfpc}
  33. interface
  34. uses
  35. SysUtils, LCLType;
  36. function UTF8Width(const Ch: TUTF8Char): Integer;
  37. implementation
  38. uses
  39. LazUTF8;
  40. type
  41. Pwidth_interval = ^Twidth_interval;
  42. Twidth_interval = array[0..1] of UCS4Char;
  43. const
  44. // From https://github.com/jquast/wcwidth/blob/master/wcwidth/table_zero.py
  45. // at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14):
  46. ZERO_WIDTH: array[0..323] of Twidth_interval = (
  47. ($00300, $0036f), // Combining Grave Accent ..Combining Latin Small Le
  48. ($00483, $00489), // Combining Cyrillic Titlo..Combining Cyrillic Milli
  49. ($00591, $005bd), // Hebrew Accent Etnahta ..Hebrew Point Meteg
  50. ($005bf, $005bf), // Hebrew Point Rafe ..Hebrew Point Rafe
  51. ($005c1, $005c2), // Hebrew Point Shin Dot ..Hebrew Point Sin Dot
  52. ($005c4, $005c5), // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot
  53. ($005c7, $005c7), // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata
  54. ($00610, $0061a), // Arabic Sign Sallallahou ..Arabic Small Kasra
  55. ($0064b, $0065f), // Arabic Fathatan ..Arabic Wavy Hamza Below
  56. ($00670, $00670), // Arabic Letter Superscrip..Arabic Letter Superscrip
  57. ($006d6, $006dc), // Arabic Small High Ligatu..Arabic Small High Seen
  58. ($006df, $006e4), // Arabic Small High Rounde..Arabic Small High Madda
  59. ($006e7, $006e8), // Arabic Small High Yeh ..Arabic Small High Noon
  60. ($006ea, $006ed), // Arabic Empty Centre Low ..Arabic Small Low Meem
  61. ($00711, $00711), // Syriac Letter Superscrip..Syriac Letter Superscrip
  62. ($00730, $0074a), // Syriac Pthaha Above ..Syriac Barrekh
  63. ($007a6, $007b0), // Thaana Abafili ..Thaana Sukun
  64. ($007eb, $007f3), // Nko Combining Short High..Nko Combining Double Dot
  65. ($007fd, $007fd), // Nko Dantayalan ..Nko Dantayalan
  66. ($00816, $00819), // Samaritan Mark In ..Samaritan Mark Dagesh
  67. ($0081b, $00823), // Samaritan Mark Epentheti..Samaritan Vowel Sign A
  68. ($00825, $00827), // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U
  69. ($00829, $0082d), // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa
  70. ($00859, $0085b), // Mandaic Affrication Mark..Mandaic Gemination Mark
  71. ($008d3, $008e1), // Arabic Small Low Waw ..Arabic Small High Sign S
  72. ($008e3, $00902), // Arabic Turned Damma Belo..Devanagari Sign Anusvara
  73. ($0093a, $0093a), // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe
  74. ($0093c, $0093c), // Devanagari Sign Nukta ..Devanagari Sign Nukta
  75. ($00941, $00948), // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai
  76. ($0094d, $0094d), // Devanagari Sign Virama ..Devanagari Sign Virama
  77. ($00951, $00957), // Devanagari Stress Sign U..Devanagari Vowel Sign Uu
  78. ($00962, $00963), // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo
  79. ($00981, $00981), // Bengali Sign Candrabindu..Bengali Sign Candrabindu
  80. ($009bc, $009bc), // Bengali Sign Nukta ..Bengali Sign Nukta
  81. ($009c1, $009c4), // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal
  82. ($009cd, $009cd), // Bengali Sign Virama ..Bengali Sign Virama
  83. ($009e2, $009e3), // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal
  84. ($009fe, $009fe), // Bengali Sandhi Mark ..Bengali Sandhi Mark
  85. ($00a01, $00a02), // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi
  86. ($00a3c, $00a3c), // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta
  87. ($00a41, $00a42), // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu
  88. ($00a47, $00a48), // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai
  89. ($00a4b, $00a4d), // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama
  90. ($00a51, $00a51), // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat
  91. ($00a70, $00a71), // Gurmukhi Tippi ..Gurmukhi Addak
  92. ($00a75, $00a75), // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash
  93. ($00a81, $00a82), // Gujarati Sign Candrabind..Gujarati Sign Anusvara
  94. ($00abc, $00abc), // Gujarati Sign Nukta ..Gujarati Sign Nukta
  95. ($00ac1, $00ac5), // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand
  96. ($00ac7, $00ac8), // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai
  97. ($00acd, $00acd), // Gujarati Sign Virama ..Gujarati Sign Virama
  98. ($00ae2, $00ae3), // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca
  99. ($00afa, $00aff), // Gujarati Sign Sukun ..Gujarati Sign Two-circle
  100. ($00b01, $00b01), // Oriya Sign Candrabindu ..Oriya Sign Candrabindu
  101. ($00b3c, $00b3c), // Oriya Sign Nukta ..Oriya Sign Nukta
  102. ($00b3f, $00b3f), // Oriya Vowel Sign I ..Oriya Vowel Sign I
  103. ($00b41, $00b44), // Oriya Vowel Sign U ..Oriya Vowel Sign Vocalic
  104. ($00b4d, $00b4d), // Oriya Sign Virama ..Oriya Sign Virama
  105. ($00b55, $00b56), // (nil) ..Oriya Ai Length Mark
  106. ($00b62, $00b63), // Oriya Vowel Sign Vocalic..Oriya Vowel Sign Vocalic
  107. ($00b82, $00b82), // Tamil Sign Anusvara ..Tamil Sign Anusvara
  108. ($00bc0, $00bc0), // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii
  109. ($00bcd, $00bcd), // Tamil Sign Virama ..Tamil Sign Virama
  110. ($00c00, $00c00), // Telugu Sign Combining Ca..Telugu Sign Combining Ca
  111. ($00c04, $00c04), // Telugu Sign Combining An..Telugu Sign Combining An
  112. ($00c3e, $00c40), // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii
  113. ($00c46, $00c48), // Telugu Vowel Sign E ..Telugu Vowel Sign Ai
  114. ($00c4a, $00c4d), // Telugu Vowel Sign O ..Telugu Sign Virama
  115. ($00c55, $00c56), // Telugu Length Mark ..Telugu Ai Length Mark
  116. ($00c62, $00c63), // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali
  117. ($00c81, $00c81), // Kannada Sign Candrabindu..Kannada Sign Candrabindu
  118. ($00cbc, $00cbc), // Kannada Sign Nukta ..Kannada Sign Nukta
  119. ($00cbf, $00cbf), // Kannada Vowel Sign I ..Kannada Vowel Sign I
  120. ($00cc6, $00cc6), // Kannada Vowel Sign E ..Kannada Vowel Sign E
  121. ($00ccc, $00ccd), // Kannada Vowel Sign Au ..Kannada Sign Virama
  122. ($00ce2, $00ce3), // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal
  123. ($00d00, $00d01), // Malayalam Sign Combining..Malayalam Sign Candrabin
  124. ($00d3b, $00d3c), // Malayalam Sign Vertical ..Malayalam Sign Circular
  125. ($00d41, $00d44), // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc
  126. ($00d4d, $00d4d), // Malayalam Sign Virama ..Malayalam Sign Virama
  127. ($00d62, $00d63), // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc
  128. ($00d81, $00d81), // (nil) ..(nil)
  129. ($00dca, $00dca), // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna
  130. ($00dd2, $00dd4), // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti
  131. ($00dd6, $00dd6), // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga
  132. ($00e31, $00e31), // Thai Character Mai Han-a..Thai Character Mai Han-a
  133. ($00e34, $00e3a), // Thai Character Sara I ..Thai Character Phinthu
  134. ($00e47, $00e4e), // Thai Character Maitaikhu..Thai Character Yamakkan
  135. ($00eb1, $00eb1), // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan
  136. ($00eb4, $00ebc), // Lao Vowel Sign I ..Lao Semivowel Sign Lo
  137. ($00ec8, $00ecd), // Lao Tone Mai Ek ..Lao Niggahita
  138. ($00f18, $00f19), // Tibetan Astrological Sig..Tibetan Astrological Sig
  139. ($00f35, $00f35), // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung
  140. ($00f37, $00f37), // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung
  141. ($00f39, $00f39), // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru
  142. ($00f71, $00f7e), // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga
  143. ($00f80, $00f84), // Tibetan Vowel Sign Rever..Tibetan Mark Halanta
  144. ($00f86, $00f87), // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags
  145. ($00f8d, $00f97), // Tibetan Subjoined Sign L..Tibetan Subjoined Letter
  146. ($00f99, $00fbc), // Tibetan Subjoined Letter..Tibetan Subjoined Letter
  147. ($00fc6, $00fc6), // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda
  148. ($0102d, $01030), // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu
  149. ($01032, $01037), // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below
  150. ($01039, $0103a), // Myanmar Sign Virama ..Myanmar Sign Asat
  151. ($0103d, $0103e), // Myanmar Consonant Sign M..Myanmar Consonant Sign M
  152. ($01058, $01059), // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal
  153. ($0105e, $01060), // Myanmar Consonant Sign M..Myanmar Consonant Sign M
  154. ($01071, $01074), // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah
  155. ($01082, $01082), // Myanmar Consonant Sign S..Myanmar Consonant Sign S
  156. ($01085, $01086), // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan
  157. ($0108d, $0108d), // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci
  158. ($0109d, $0109d), // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton
  159. ($0135d, $0135f), // Ethiopic Combining Gemin..Ethiopic Combining Gemin
  160. ($01712, $01714), // Tagalog Vowel Sign I ..Tagalog Sign Virama
  161. ($01732, $01734), // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod
  162. ($01752, $01753), // Buhid Vowel Sign I ..Buhid Vowel Sign U
  163. ($01772, $01773), // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U
  164. ($017b4, $017b5), // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa
  165. ($017b7, $017bd), // Khmer Vowel Sign I ..Khmer Vowel Sign Ua
  166. ($017c6, $017c6), // Khmer Sign Nikahit ..Khmer Sign Nikahit
  167. ($017c9, $017d3), // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat
  168. ($017dd, $017dd), // Khmer Sign Atthacan ..Khmer Sign Atthacan
  169. ($0180b, $0180d), // Mongolian Free Variation..Mongolian Free Variation
  170. ($01885, $01886), // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal
  171. ($018a9, $018a9), // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal
  172. ($01920, $01922), // Limbu Vowel Sign A ..Limbu Vowel Sign U
  173. ($01927, $01928), // Limbu Vowel Sign E ..Limbu Vowel Sign O
  174. ($01932, $01932), // Limbu Small Letter Anusv..Limbu Small Letter Anusv
  175. ($01939, $0193b), // Limbu Sign Mukphreng ..Limbu Sign Sa-i
  176. ($01a17, $01a18), // Buginese Vowel Sign I ..Buginese Vowel Sign U
  177. ($01a1b, $01a1b), // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae
  178. ($01a56, $01a56), // Tai Tham Consonant Sign ..Tai Tham Consonant Sign
  179. ($01a58, $01a5e), // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign
  180. ($01a60, $01a60), // Tai Tham Sign Sakot ..Tai Tham Sign Sakot
  181. ($01a62, $01a62), // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai
  182. ($01a65, $01a6c), // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B
  183. ($01a73, $01a7c), // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue
  184. ($01a7f, $01a7f), // Tai Tham Combining Crypt..Tai Tham Combining Crypt
  185. ($01ab0, $01ac0), // Combining Doubled Circum..(nil)
  186. ($01b00, $01b03), // Balinese Sign Ulu Ricem ..Balinese Sign Surang
  187. ($01b34, $01b34), // Balinese Sign Rerekan ..Balinese Sign Rerekan
  188. ($01b36, $01b3a), // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R
  189. ($01b3c, $01b3c), // Balinese Vowel Sign La L..Balinese Vowel Sign La L
  190. ($01b42, $01b42), // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe
  191. ($01b6b, $01b73), // Balinese Musical Symbol ..Balinese Musical Symbol
  192. ($01b80, $01b81), // Sundanese Sign Panyecek ..Sundanese Sign Panglayar
  193. ($01ba2, $01ba5), // Sundanese Consonant Sign..Sundanese Vowel Sign Pan
  194. ($01ba8, $01ba9), // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan
  195. ($01bab, $01bad), // Sundanese Sign Virama ..Sundanese Consonant Sign
  196. ($01be6, $01be6), // Batak Sign Tompi ..Batak Sign Tompi
  197. ($01be8, $01be9), // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee
  198. ($01bed, $01bed), // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O
  199. ($01bef, $01bf1), // Batak Vowel Sign U For S..Batak Consonant Sign H
  200. ($01c2c, $01c33), // Lepcha Vowel Sign E ..Lepcha Consonant Sign T
  201. ($01c36, $01c37), // Lepcha Sign Ran ..Lepcha Sign Nukta
  202. ($01cd0, $01cd2), // Vedic Tone Karshana ..Vedic Tone Prenkha
  203. ($01cd4, $01ce0), // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash
  204. ($01ce2, $01ce8), // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda
  205. ($01ced, $01ced), // Vedic Sign Tiryak ..Vedic Sign Tiryak
  206. ($01cf4, $01cf4), // Vedic Tone Candra Above ..Vedic Tone Candra Above
  207. ($01cf8, $01cf9), // Vedic Tone Ring Above ..Vedic Tone Double Ring A
  208. ($01dc0, $01df9), // Combining Dotted Grave A..Combining Wide Inverted
  209. ($01dfb, $01dff), // Combining Deletion Mark ..Combining Right Arrowhea
  210. ($020d0, $020f0), // Combining Left Harpoon A..Combining Asterisk Above
  211. ($02cef, $02cf1), // Coptic Combining Ni Abov..Coptic Combining Spiritu
  212. ($02d7f, $02d7f), // Tifinagh Consonant Joine..Tifinagh Consonant Joine
  213. ($02de0, $02dff), // Combining Cyrillic Lette..Combining Cyrillic Lette
  214. ($0302a, $0302d), // Ideographic Level Tone M..Ideographic Entering Ton
  215. ($03099, $0309a), // Combining Katakana-hirag..Combining Katakana-hirag
  216. ($0a66f, $0a672), // Combining Cyrillic Vzmet..Combining Cyrillic Thous
  217. ($0a674, $0a67d), // Combining Cyrillic Lette..Combining Cyrillic Payer
  218. ($0a69e, $0a69f), // Combining Cyrillic Lette..Combining Cyrillic Lette
  219. ($0a6f0, $0a6f1), // Bamum Combining Mark Koq..Bamum Combining Mark Tuk
  220. ($0a802, $0a802), // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva
  221. ($0a806, $0a806), // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant
  222. ($0a80b, $0a80b), // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva
  223. ($0a825, $0a826), // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign
  224. ($0a82c, $0a82c), // (nil) ..(nil)
  225. ($0a8c4, $0a8c5), // Saurashtra Sign Virama ..Saurashtra Sign Candrabi
  226. ($0a8e0, $0a8f1), // Combining Devanagari Dig..Combining Devanagari Sig
  227. ($0a8ff, $0a8ff), // Devanagari Vowel Sign Ay..Devanagari Vowel Sign Ay
  228. ($0a926, $0a92d), // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop
  229. ($0a947, $0a951), // Rejang Vowel Sign I ..Rejang Consonant Sign R
  230. ($0a980, $0a982), // Javanese Sign Panyangga ..Javanese Sign Layar
  231. ($0a9b3, $0a9b3), // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu
  232. ($0a9b6, $0a9b9), // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku
  233. ($0a9bc, $0a9bd), // Javanese Vowel Sign Pepe..Javanese Consonant Sign
  234. ($0a9e5, $0a9e5), // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw
  235. ($0aa29, $0aa2e), // Cham Vowel Sign Aa ..Cham Vowel Sign Oe
  236. ($0aa31, $0aa32), // Cham Vowel Sign Au ..Cham Vowel Sign Ue
  237. ($0aa35, $0aa36), // Cham Consonant Sign La ..Cham Consonant Sign Wa
  238. ($0aa43, $0aa43), // Cham Consonant Sign Fina..Cham Consonant Sign Fina
  239. ($0aa4c, $0aa4c), // Cham Consonant Sign Fina..Cham Consonant Sign Fina
  240. ($0aa7c, $0aa7c), // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T
  241. ($0aab0, $0aab0), // Tai Viet Mai Kang ..Tai Viet Mai Kang
  242. ($0aab2, $0aab4), // Tai Viet Vowel I ..Tai Viet Vowel U
  243. ($0aab7, $0aab8), // Tai Viet Mai Khit ..Tai Viet Vowel Ia
  244. ($0aabe, $0aabf), // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek
  245. ($0aac1, $0aac1), // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho
  246. ($0aaec, $0aaed), // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
  247. ($0aaf6, $0aaf6), // Meetei Mayek Virama ..Meetei Mayek Virama
  248. ($0abe5, $0abe5), // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
  249. ($0abe8, $0abe8), // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
  250. ($0abed, $0abed), // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek
  251. ($0fb1e, $0fb1e), // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani
  252. ($0fe00, $0fe0f), // Variation Selector-1 ..Variation Selector-16
  253. ($0fe20, $0fe2f), // Combining Ligature Left ..Combining Cyrillic Titlo
  254. ($101fd, $101fd), // Phaistos Disc Sign Combi..Phaistos Disc Sign Combi
  255. ($102e0, $102e0), // Coptic Epact Thousands M..Coptic Epact Thousands M
  256. ($10376, $1037a), // Combining Old Permic Let..Combining Old Permic Let
  257. ($10a01, $10a03), // Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo
  258. ($10a05, $10a06), // Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O
  259. ($10a0c, $10a0f), // Kharoshthi Vowel Length ..Kharoshthi Sign Visarga
  260. ($10a38, $10a3a), // Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo
  261. ($10a3f, $10a3f), // Kharoshthi Virama ..Kharoshthi Virama
  262. ($10ae5, $10ae6), // Manichaean Abbreviation ..Manichaean Abbreviation
  263. ($10d24, $10d27), // Hanifi Rohingya Sign Har..Hanifi Rohingya Sign Tas
  264. ($10eab, $10eac), // (nil) ..(nil)
  265. ($10f46, $10f50), // Sogdian Combining Dot Be..Sogdian Combining Stroke
  266. ($11001, $11001), // Brahmi Sign Anusvara ..Brahmi Sign Anusvara
  267. ($11038, $11046), // Brahmi Vowel Sign Aa ..Brahmi Virama
  268. ($1107f, $11081), // Brahmi Number Joiner ..Kaithi Sign Anusvara
  269. ($110b3, $110b6), // Kaithi Vowel Sign U ..Kaithi Vowel Sign Ai
  270. ($110b9, $110ba), // Kaithi Sign Virama ..Kaithi Sign Nukta
  271. ($11100, $11102), // Chakma Sign Candrabindu ..Chakma Sign Visarga
  272. ($11127, $1112b), // Chakma Vowel Sign A ..Chakma Vowel Sign Uu
  273. ($1112d, $11134), // Chakma Vowel Sign Ai ..Chakma Maayyaa
  274. ($11173, $11173), // Mahajani Sign Nukta ..Mahajani Sign Nukta
  275. ($11180, $11181), // Sharada Sign Candrabindu..Sharada Sign Anusvara
  276. ($111b6, $111be), // Sharada Vowel Sign U ..Sharada Vowel Sign O
  277. ($111c9, $111cc), // Sharada Sandhi Mark ..Sharada Extra Short Vowe
  278. ($111cf, $111cf), // (nil) ..(nil)
  279. ($1122f, $11231), // Khojki Vowel Sign U ..Khojki Vowel Sign Ai
  280. ($11234, $11234), // Khojki Sign Anusvara ..Khojki Sign Anusvara
  281. ($11236, $11237), // Khojki Sign Nukta ..Khojki Sign Shadda
  282. ($1123e, $1123e), // Khojki Sign Sukun ..Khojki Sign Sukun
  283. ($112df, $112df), // Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara
  284. ($112e3, $112ea), // Khudawadi Vowel Sign U ..Khudawadi Sign Virama
  285. ($11300, $11301), // Grantha Sign Combining A..Grantha Sign Candrabindu
  286. ($1133b, $1133c), // Combining Bindu Below ..Grantha Sign Nukta
  287. ($11340, $11340), // Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii
  288. ($11366, $1136c), // Combining Grantha Digit ..Combining Grantha Digit
  289. ($11370, $11374), // Combining Grantha Letter..Combining Grantha Letter
  290. ($11438, $1143f), // Newa Vowel Sign U ..Newa Vowel Sign Ai
  291. ($11442, $11444), // Newa Sign Virama ..Newa Sign Anusvara
  292. ($11446, $11446), // Newa Sign Nukta ..Newa Sign Nukta
  293. ($1145e, $1145e), // Newa Sandhi Mark ..Newa Sandhi Mark
  294. ($114b3, $114b8), // Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal
  295. ($114ba, $114ba), // Tirhuta Vowel Sign Short..Tirhuta Vowel Sign Short
  296. ($114bf, $114c0), // Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara
  297. ($114c2, $114c3), // Tirhuta Sign Virama ..Tirhuta Sign Nukta
  298. ($115b2, $115b5), // Siddham Vowel Sign U ..Siddham Vowel Sign Vocal
  299. ($115bc, $115bd), // Siddham Sign Candrabindu..Siddham Sign Anusvara
  300. ($115bf, $115c0), // Siddham Sign Virama ..Siddham Sign Nukta
  301. ($115dc, $115dd), // Siddham Vowel Sign Alter..Siddham Vowel Sign Alter
  302. ($11633, $1163a), // Modi Vowel Sign U ..Modi Vowel Sign Ai
  303. ($1163d, $1163d), // Modi Sign Anusvara ..Modi Sign Anusvara
  304. ($1163f, $11640), // Modi Sign Virama ..Modi Sign Ardhacandra
  305. ($116ab, $116ab), // Takri Sign Anusvara ..Takri Sign Anusvara
  306. ($116ad, $116ad), // Takri Vowel Sign Aa ..Takri Vowel Sign Aa
  307. ($116b0, $116b5), // Takri Vowel Sign U ..Takri Vowel Sign Au
  308. ($116b7, $116b7), // Takri Sign Nukta ..Takri Sign Nukta
  309. ($1171d, $1171f), // Ahom Consonant Sign Medi..Ahom Consonant Sign Medi
  310. ($11722, $11725), // Ahom Vowel Sign I ..Ahom Vowel Sign Uu
  311. ($11727, $1172b), // Ahom Vowel Sign Aw ..Ahom Sign Killer
  312. ($1182f, $11837), // Dogra Vowel Sign U ..Dogra Sign Anusvara
  313. ($11839, $1183a), // Dogra Sign Virama ..Dogra Sign Nukta
  314. ($1193b, $1193c), // (nil) ..(nil)
  315. ($1193e, $1193e), // (nil) ..(nil)
  316. ($11943, $11943), // (nil) ..(nil)
  317. ($119d4, $119d7), // Nandinagari Vowel Sign U..Nandinagari Vowel Sign V
  318. ($119da, $119db), // Nandinagari Vowel Sign E..Nandinagari Vowel Sign A
  319. ($119e0, $119e0), // Nandinagari Sign Virama ..Nandinagari Sign Virama
  320. ($11a01, $11a0a), // Zanabazar Square Vowel S..Zanabazar Square Vowel L
  321. ($11a33, $11a38), // Zanabazar Square Final C..Zanabazar Square Sign An
  322. ($11a3b, $11a3e), // Zanabazar Square Cluster..Zanabazar Square Cluster
  323. ($11a47, $11a47), // Zanabazar Square Subjoin..Zanabazar Square Subjoin
  324. ($11a51, $11a56), // Soyombo Vowel Sign I ..Soyombo Vowel Sign Oe
  325. ($11a59, $11a5b), // Soyombo Vowel Sign Vocal..Soyombo Vowel Length Mar
  326. ($11a8a, $11a96), // Soyombo Final Consonant ..Soyombo Sign Anusvara
  327. ($11a98, $11a99), // Soyombo Gemination Mark ..Soyombo Subjoiner
  328. ($11c30, $11c36), // Bhaiksuki Vowel Sign I ..Bhaiksuki Vowel Sign Voc
  329. ($11c38, $11c3d), // Bhaiksuki Vowel Sign E ..Bhaiksuki Sign Anusvara
  330. ($11c3f, $11c3f), // Bhaiksuki Sign Virama ..Bhaiksuki Sign Virama
  331. ($11c92, $11ca7), // Marchen Subjoined Letter..Marchen Subjoined Letter
  332. ($11caa, $11cb0), // Marchen Subjoined Letter..Marchen Vowel Sign Aa
  333. ($11cb2, $11cb3), // Marchen Vowel Sign U ..Marchen Vowel Sign E
  334. ($11cb5, $11cb6), // Marchen Sign Anusvara ..Marchen Sign Candrabindu
  335. ($11d31, $11d36), // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign
  336. ($11d3a, $11d3a), // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign
  337. ($11d3c, $11d3d), // Masaram Gondi Vowel Sign..Masaram Gondi Vowel Sign
  338. ($11d3f, $11d45), // Masaram Gondi Vowel Sign..Masaram Gondi Virama
  339. ($11d47, $11d47), // Masaram Gondi Ra-kara ..Masaram Gondi Ra-kara
  340. ($11d90, $11d91), // Gunjala Gondi Vowel Sign..Gunjala Gondi Vowel Sign
  341. ($11d95, $11d95), // Gunjala Gondi Sign Anusv..Gunjala Gondi Sign Anusv
  342. ($11d97, $11d97), // Gunjala Gondi Virama ..Gunjala Gondi Virama
  343. ($11ef3, $11ef4), // Makasar Vowel Sign I ..Makasar Vowel Sign U
  344. ($16af0, $16af4), // Bassa Vah Combining High..Bassa Vah Combining High
  345. ($16b30, $16b36), // Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta
  346. ($16f4f, $16f4f), // Miao Sign Consonant Modi..Miao Sign Consonant Modi
  347. ($16f8f, $16f92), // Miao Tone Right ..Miao Tone Below
  348. ($16fe4, $16fe4), // (nil) ..(nil)
  349. ($1bc9d, $1bc9e), // Duployan Thick Letter Se..Duployan Double Mark
  350. ($1d167, $1d169), // Musical Symbol Combining..Musical Symbol Combining
  351. ($1d17b, $1d182), // Musical Symbol Combining..Musical Symbol Combining
  352. ($1d185, $1d18b), // Musical Symbol Combining..Musical Symbol Combining
  353. ($1d1aa, $1d1ad), // Musical Symbol Combining..Musical Symbol Combining
  354. ($1d242, $1d244), // Combining Greek Musical ..Combining Greek Musical
  355. ($1da00, $1da36), // Signwriting Head Rim ..Signwriting Air Sucking
  356. ($1da3b, $1da6c), // Signwriting Mouth Closed..Signwriting Excitement
  357. ($1da75, $1da75), // Signwriting Upper Body T..Signwriting Upper Body T
  358. ($1da84, $1da84), // Signwriting Location Hea..Signwriting Location Hea
  359. ($1da9b, $1da9f), // Signwriting Fill Modifie..Signwriting Fill Modifie
  360. ($1daa1, $1daaf), // Signwriting Rotation Mod..Signwriting Rotation Mod
  361. ($1e000, $1e006), // Combining Glagolitic Let..Combining Glagolitic Let
  362. ($1e008, $1e018), // Combining Glagolitic Let..Combining Glagolitic Let
  363. ($1e01b, $1e021), // Combining Glagolitic Let..Combining Glagolitic Let
  364. ($1e023, $1e024), // Combining Glagolitic Let..Combining Glagolitic Let
  365. ($1e026, $1e02a), // Combining Glagolitic Let..Combining Glagolitic Let
  366. ($1e130, $1e136), // Nyiakeng Puachue Hmong T..Nyiakeng Puachue Hmong T
  367. ($1e2ec, $1e2ef), // Wancho Tone Tup ..Wancho Tone Koini
  368. ($1e8d0, $1e8d6), // Mende Kikakui Combining ..Mende Kikakui Combining
  369. ($1e944, $1e94a), // Adlam Alif Lengthener ..Adlam Nukta
  370. ($e0100, $e01ef) // Variation Selector-17 ..Variation Selector-256
  371. );
  372. // https://github.com/jquast/wcwidth/blob/master/wcwidth/table_wide.py
  373. // at commit b29897e5a1b403a0e36f7fc991614981cbc42475 (2020-07-14):
  374. WIDE_EASTASIAN: array[0..115] of Twidth_interval = (
  375. ($01100, $0115f), // Hangul Choseong Kiyeok ..Hangul Choseong Filler
  376. ($0231a, $0231b), // Watch ..Hourglass
  377. ($02329, $0232a), // Left-pointing Angle Brac..Right-pointing Angle Bra
  378. ($023e9, $023ec), // Black Right-pointing Dou..Black Down-pointing Doub
  379. ($023f0, $023f0), // Alarm Clock ..Alarm Clock
  380. ($023f3, $023f3), // Hourglass With Flowing S..Hourglass With Flowing S
  381. ($025fd, $025fe), // White Medium Small Squar..Black Medium Small Squar
  382. ($02614, $02615), // Umbrella With Rain Drops..Hot Beverage
  383. ($02648, $02653), // Aries ..Pisces
  384. ($0267f, $0267f), // Wheelchair Symbol ..Wheelchair Symbol
  385. ($02693, $02693), // Anchor ..Anchor
  386. ($026a1, $026a1), // High Voltage Sign ..High Voltage Sign
  387. ($026aa, $026ab), // Medium White Circle ..Medium Black Circle
  388. ($026bd, $026be), // Soccer Ball ..Baseball
  389. ($026c4, $026c5), // Snowman Without Snow ..Sun Behind Cloud
  390. ($026ce, $026ce), // Ophiuchus ..Ophiuchus
  391. ($026d4, $026d4), // No Entry ..No Entry
  392. ($026ea, $026ea), // Church ..Church
  393. ($026f2, $026f3), // Fountain ..Flag In Hole
  394. ($026f5, $026f5), // Sailboat ..Sailboat
  395. ($026fa, $026fa), // Tent ..Tent
  396. ($026fd, $026fd), // Fuel Pump ..Fuel Pump
  397. ($02705, $02705), // White Heavy Check Mark ..White Heavy Check Mark
  398. ($0270a, $0270b), // Raised Fist ..Raised Hand
  399. ($02728, $02728), // Sparkles ..Sparkles
  400. ($0274c, $0274c), // Cross Mark ..Cross Mark
  401. ($0274e, $0274e), // Negative Squared Cross M..Negative Squared Cross M
  402. ($02753, $02755), // Black Question Mark Orna..White Exclamation Mark O
  403. ($02757, $02757), // Heavy Exclamation Mark S..Heavy Exclamation Mark S
  404. ($02795, $02797), // Heavy Plus Sign ..Heavy Division Sign
  405. ($027b0, $027b0), // Curly Loop ..Curly Loop
  406. ($027bf, $027bf), // Double Curly Loop ..Double Curly Loop
  407. ($02b1b, $02b1c), // Black Large Square ..White Large Square
  408. ($02b50, $02b50), // White Medium Star ..White Medium Star
  409. ($02b55, $02b55), // Heavy Large Circle ..Heavy Large Circle
  410. ($02e80, $02e99), // Cjk Radical Repeat ..Cjk Radical Rap
  411. ($02e9b, $02ef3), // Cjk Radical Choke ..Cjk Radical C-simplified
  412. ($02f00, $02fd5), // Kangxi Radical One ..Kangxi Radical Flute
  413. ($02ff0, $02ffb), // Ideographic Description ..Ideographic Description
  414. ($03000, $0303e), // Ideographic Space ..Ideographic Variation In
  415. ($03041, $03096), // Hiragana Letter Small A ..Hiragana Letter Small Ke
  416. ($03099, $030ff), // Combining Katakana-hirag..Katakana Digraph Koto
  417. ($03105, $0312f), // Bopomofo Letter B ..Bopomofo Letter Nn
  418. ($03131, $0318e), // Hangul Letter Kiyeok ..Hangul Letter Araeae
  419. ($03190, $031e3), // Ideographic Annotation L..Cjk Stroke Q
  420. ($031f0, $0321e), // Katakana Letter Small Ku..Parenthesized Korean Cha
  421. ($03220, $03247), // Parenthesized Ideograph ..Circled Ideograph Koto
  422. ($03250, $04dbf), // Partnership Sign ..(nil)
  423. ($04e00, $0a48c), // Cjk Unified Ideograph-4e..Yi Syllable Yyr
  424. ($0a490, $0a4c6), // Yi Radical Qot ..Yi Radical Ke
  425. ($0a960, $0a97c), // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo
  426. ($0ac00, $0d7a3), // Hangul Syllable Ga ..Hangul Syllable Hih
  427. ($0f900, $0faff), // Cjk Compatibility Ideogr..(nil)
  428. ($0fe10, $0fe19), // Presentation Form For Ve..Presentation Form For Ve
  429. ($0fe30, $0fe52), // Presentation Form For Ve..Small Full Stop
  430. ($0fe54, $0fe66), // Small Semicolon ..Small Equals Sign
  431. ($0fe68, $0fe6b), // Small Reverse Solidus ..Small Commercial At
  432. ($0ff01, $0ff60), // Fullwidth Exclamation Ma..Fullwidth Right White Pa
  433. ($0ffe0, $0ffe6), // Fullwidth Cent Sign ..Fullwidth Won Sign
  434. ($16fe0, $16fe4), // Tangut Iteration Mark ..(nil)
  435. ($16ff0, $16ff1), // (nil) ..(nil)
  436. ($17000, $187f7), // (nil) ..(nil)
  437. ($18800, $18cd5), // Tangut Component-001 ..(nil)
  438. ($18d00, $18d08), // (nil) ..(nil)
  439. ($1b000, $1b11e), // Katakana Letter Archaic ..Hentaigana Letter N-mu-m
  440. ($1b150, $1b152), // Hiragana Letter Small Wi..Hiragana Letter Small Wo
  441. ($1b164, $1b167), // Katakana Letter Small Wi..Katakana Letter Small N
  442. ($1b170, $1b2fb), // Nushu Character-1b170 ..Nushu Character-1b2fb
  443. ($1f004, $1f004), // Mahjong Tile Red Dragon ..Mahjong Tile Red Dragon
  444. ($1f0cf, $1f0cf), // Playing Card Black Joker..Playing Card Black Joker
  445. ($1f18e, $1f18e), // Negative Squared Ab ..Negative Squared Ab
  446. ($1f191, $1f19a), // Squared Cl ..Squared Vs
  447. ($1f200, $1f202), // Square Hiragana Hoka ..Squared Katakana Sa
  448. ($1f210, $1f23b), // Squared Cjk Unified Ideo..Squared Cjk Unified Ideo
  449. ($1f240, $1f248), // Tortoise Shell Bracketed..Tortoise Shell Bracketed
  450. ($1f250, $1f251), // Circled Ideograph Advant..Circled Ideograph Accept
  451. ($1f260, $1f265), // Rounded Symbol For Fu ..Rounded Symbol For Cai
  452. ($1f300, $1f320), // Cyclone ..Shooting Star
  453. ($1f32d, $1f335), // Hot Dog ..Cactus
  454. ($1f337, $1f37c), // Tulip ..Baby Bottle
  455. ($1f37e, $1f393), // Bottle With Popping Cork..Graduation Cap
  456. ($1f3a0, $1f3ca), // Carousel Horse ..Swimmer
  457. ($1f3cf, $1f3d3), // Cricket Bat And Ball ..Table Tennis Paddle And
  458. ($1f3e0, $1f3f0), // House Building ..European Castle
  459. ($1f3f4, $1f3f4), // Waving Black Flag ..Waving Black Flag
  460. ($1f3f8, $1f43e), // Badminton Racquet And Sh..Paw Prints
  461. ($1f440, $1f440), // Eyes ..Eyes
  462. ($1f442, $1f4fc), // Ear ..Videocassette
  463. ($1f4ff, $1f53d), // Prayer Beads ..Down-pointing Small Red
  464. ($1f54b, $1f54e), // Kaaba ..Menorah With Nine Branch
  465. ($1f550, $1f567), // Clock Face One Oclock ..Clock Face Twelve-thirty
  466. ($1f57a, $1f57a), // Man Dancing ..Man Dancing
  467. ($1f595, $1f596), // Reversed Hand With Middl..Raised Hand With Part Be
  468. ($1f5a4, $1f5a4), // Black Heart ..Black Heart
  469. ($1f5fb, $1f64f), // Mount Fuji ..Person With Folded Hands
  470. ($1f680, $1f6c5), // Rocket ..Left Luggage
  471. ($1f6cc, $1f6cc), // Sleeping Accommodation ..Sleeping Accommodation
  472. ($1f6d0, $1f6d2), // Place Of Worship ..Shopping Trolley
  473. ($1f6d5, $1f6d7), // Hindu Temple ..(nil)
  474. ($1f6eb, $1f6ec), // Airplane Departure ..Airplane Arriving
  475. ($1f6f4, $1f6fc), // Scooter ..(nil)
  476. ($1f7e0, $1f7eb), // Large Orange Circle ..Large Brown Square
  477. ($1f90c, $1f93a), // (nil) ..Fencer
  478. ($1f93c, $1f945), // Wrestlers ..Goal Net
  479. ($1f947, $1f978), // First Place Medal ..(nil)
  480. ($1f97a, $1f9cb), // Face With Pleading Eyes ..(nil)
  481. ($1f9cd, $1f9ff), // Standing Person ..Nazar Amulet
  482. ($1fa70, $1fa74), // Ballet Shoes ..(nil)
  483. ($1fa78, $1fa7a), // Drop Of Blood ..Stethoscope
  484. ($1fa80, $1fa86), // Yo-yo ..(nil)
  485. ($1fa90, $1faa8), // Ringed Planet ..(nil)
  486. ($1fab0, $1fab6), // (nil) ..(nil)
  487. ($1fac0, $1fac2), // (nil) ..(nil)
  488. ($1fad0, $1fad6), // (nil) ..(nil)
  489. ($20000, $2fffd), // Cjk Unified Ideograph-20..(nil)
  490. ($30000, $3fffd) // (nil) ..(nil)
  491. );
  492. function intable(table: Pwidth_interval; table_length: Integer; c: UCS4Char): Boolean;
  493. var
  494. bot, top, mid: Integer;
  495. begin
  496. // First quick check for Latin1 etc. characters.
  497. if (c < table[0, 0]) then Exit(false);
  498. // Binary search in table.
  499. bot := 0;
  500. top := table_length - 1;
  501. while (top >= bot) do
  502. begin
  503. mid := (bot + top) div 2;
  504. if (table[mid, 1] < c) then
  505. bot := mid + 1
  506. else if (table[mid, 0] > c) then
  507. top := mid - 1
  508. else begin
  509. Exit(true);
  510. end;
  511. end;
  512. Result := false;
  513. end;
  514. function wcwidth(ucs: UCS4Char): Integer;
  515. begin
  516. // NOTE: created by hand, there isn't anything identifiable other than
  517. // general Cf category code to identify these, and some characters in Cf
  518. // category code are of non-zero width.
  519. if ((ucs = 0) or
  520. (ucs = $034F) or
  521. (($200B <= ucs) and (ucs <= $200F)) or
  522. (ucs = $2028) or
  523. (ucs = $2029) or
  524. (($202A <= ucs) and (ucs <= $202E)) or
  525. (($2060 <= ucs) and (ucs <= $2063))) then
  526. begin
  527. Exit(0);
  528. end;
  529. // C0/C1 control characters.
  530. if ((ucs < 32) or (($07F <= ucs) and (ucs < $0A0))) then Exit(-1);
  531. // Combining characters with zero width.
  532. if (intable(ZERO_WIDTH, Length(ZERO_WIDTH), ucs)) then Exit(0);
  533. if intable(WIDE_EASTASIAN, Length(WIDE_EASTASIAN), ucs) then
  534. Result := 2
  535. else
  536. Result := 1;
  537. end;
  538. function UTF8Width(const Ch: TUTF8Char): Integer;
  539. var
  540. CharLen: Integer;
  541. begin
  542. Result:= wcwidth(UTF8CodepointToUnicode(@Ch[1], CharLen));
  543. end;
  544. end.