encoding.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. -- encoding borrowed from signs_lib fork at https://github.com/lord-server/lord
  2. local ansi_decode = {
  3. [128] = "\208\130",
  4. [129] = "\208\131",
  5. [130] = "\226\128\154",
  6. [131] = "\209\147",
  7. [132] = "\226\128\158",
  8. [133] = "\226\128\166",
  9. [134] = "\226\128\160",
  10. [135] = "\226\128\161",
  11. [136] = "\226\130\172",
  12. [137] = "\226\128\176",
  13. [138] = "\208\137",
  14. [139] = "\226\128\185",
  15. [140] = "\208\138",
  16. [141] = "\208\140",
  17. [142] = "\208\139",
  18. [143] = "\208\143",
  19. [144] = "\209\146",
  20. [145] = "\226\128\152",
  21. [146] = "\226\128\153",
  22. [147] = "\226\128\156",
  23. [148] = "\226\128\157",
  24. [149] = "\226\128\162",
  25. [150] = "\226\128\147",
  26. [151] = "\226\128\148",
  27. [152] = "\194\152",
  28. [153] = "\226\132\162",
  29. [154] = "\209\153",
  30. [155] = "\226\128\186",
  31. [156] = "\209\154",
  32. [157] = "\209\156",
  33. [158] = "\209\155",
  34. [159] = "\209\159",
  35. [160] = "\194\160",
  36. [161] = "\209\142",
  37. [162] = "\209\158",
  38. [163] = "\208\136",
  39. [164] = "\194\164",
  40. [165] = "\210\144",
  41. [166] = "\194\166",
  42. [167] = "\194\167",
  43. [168] = "\208\129",
  44. [169] = "\194\169",
  45. [170] = "\208\132",
  46. [171] = "\194\171",
  47. [172] = "\194\172",
  48. [173] = "\194\173",
  49. [174] = "\194\174",
  50. [175] = "\208\135",
  51. [176] = "\194\176",
  52. [177] = "\194\177",
  53. [178] = "\208\134",
  54. [179] = "\209\150",
  55. [180] = "\210\145",
  56. [181] = "\194\181",
  57. [182] = "\194\182",
  58. [183] = "\194\183",
  59. [184] = "\209\145",
  60. [185] = "\226\132\150",
  61. [186] = "\209\148",
  62. [187] = "\194\187",
  63. [188] = "\209\152",
  64. [189] = "\208\133",
  65. [190] = "\209\149",
  66. [191] = "\209\151"
  67. }
  68. local utf8_decode = {
  69. [128] = {
  70. [147] = "\150",
  71. [148] = "\151",
  72. [152] = "\145",
  73. [153] = "\146",
  74. [154] = "\130",
  75. [156] = "\147",
  76. [157] = "\148",
  77. [158] = "\132",
  78. [160] = "\134",
  79. [161] = "\135",
  80. [162] = "\149",
  81. [166] = "\133",
  82. [176] = "\137",
  83. [185] = "\139",
  84. [186] = "\155"
  85. },
  86. [130] = {[172] = "\136"},
  87. [132] = {[150] = "\185", [162] = "\153"},
  88. [194] = {
  89. [152] = "\152",
  90. [160] = "\160",
  91. [164] = "\164",
  92. [166] = "\166",
  93. [167] = "\167",
  94. [169] = "\169",
  95. [171] = "\171",
  96. [172] = "\172",
  97. [173] = "\173",
  98. [174] = "\174",
  99. [176] = "\176",
  100. [177] = "\177",
  101. [181] = "\181",
  102. [182] = "\182",
  103. [183] = "\183",
  104. [187] = "\187"
  105. },
  106. [208] = {
  107. [129] = "\168",
  108. [130] = "\128",
  109. [131] = "\129",
  110. [132] = "\170",
  111. [133] = "\189",
  112. [134] = "\178",
  113. [135] = "\175",
  114. [136] = "\163",
  115. [137] = "\138",
  116. [138] = "\140",
  117. [139] = "\142",
  118. [140] = "\141",
  119. [143] = "\143",
  120. [144] = "\192",
  121. [145] = "\193",
  122. [146] = "\194",
  123. [147] = "\195",
  124. [148] = "\196",
  125. [149] = "\197",
  126. [150] = "\198",
  127. [151] = "\199",
  128. [152] = "\200",
  129. [153] = "\201",
  130. [154] = "\202",
  131. [155] = "\203",
  132. [156] = "\204",
  133. [157] = "\205",
  134. [158] = "\206",
  135. [159] = "\207",
  136. [160] = "\208",
  137. [161] = "\209",
  138. [162] = "\210",
  139. [163] = "\211",
  140. [164] = "\212",
  141. [165] = "\213",
  142. [166] = "\214",
  143. [167] = "\215",
  144. [168] = "\216",
  145. [169] = "\217",
  146. [170] = "\218",
  147. [171] = "\219",
  148. [172] = "\220",
  149. [173] = "\221",
  150. [174] = "\222",
  151. [175] = "\223",
  152. [176] = "\224",
  153. [177] = "\225",
  154. [178] = "\226",
  155. [179] = "\227",
  156. [180] = "\228",
  157. [181] = "\229",
  158. [182] = "\230",
  159. [183] = "\231",
  160. [184] = "\232",
  161. [185] = "\233",
  162. [186] = "\234",
  163. [187] = "\235",
  164. [188] = "\236",
  165. [189] = "\237",
  166. [190] = "\238",
  167. [191] = "\239"
  168. },
  169. [209] = {
  170. [128] = "\240",
  171. [129] = "\241",
  172. [130] = "\242",
  173. [131] = "\243",
  174. [132] = "\244",
  175. [133] = "\245",
  176. [134] = "\246",
  177. [135] = "\247",
  178. [136] = "\248",
  179. [137] = "\249",
  180. [138] = "\250",
  181. [139] = "\251",
  182. [140] = "\252",
  183. [141] = "\253",
  184. [142] = "\254",
  185. [143] = "\255",
  186. [144] = "\161",
  187. [145] = "\184",
  188. [146] = "\144",
  189. [147] = "\131",
  190. [148] = "\186",
  191. [149] = "\190",
  192. [150] = "\179",
  193. [151] = "\191",
  194. [152] = "\188",
  195. [153] = "\154",
  196. [154] = "\156",
  197. [155] = "\158",
  198. [156] = "\157",
  199. [158] = "\162",
  200. [159] = "\159"
  201. },
  202. [210] = {[144] = "\165", [145] = "\180"}
  203. }
  204. local nmdc = {
  205. [36] = "$",
  206. [124] = "|"
  207. }
  208. function AnsiToUtf8(s)
  209. local r, b = ""
  210. for i = 1, s and s:len() or 0 do
  211. b = s:byte(i)
  212. if b < 128 then
  213. r = r .. string.char(b)
  214. else
  215. if b > 239 then
  216. r = r .. "\209" .. string.char(b - 112)
  217. elseif b > 191 then
  218. r = r .. "\208" .. string.char(b - 48)
  219. elseif ansi_decode[b] then
  220. r = r .. ansi_decode[b]
  221. else
  222. r = r .. "_"
  223. end
  224. end
  225. end
  226. return r
  227. end
  228. function Utf8ToAnsi(s)
  229. local a, j, r, b = 0, 0, ""
  230. for i = 1, s and s:len() or 0 do
  231. b = s:byte(i)
  232. if b < 128 then
  233. if nmdc[b] then
  234. r = r .. nmdc[b]
  235. else
  236. r = r .. string.char(b)
  237. end
  238. elseif a == 2 then
  239. a, j = a - 1, b
  240. elseif a == 1 then
  241. --if j == nil or b == nil then return r end
  242. --print(j)
  243. --print(b)
  244. --local ansi = utf8_decode[j]
  245. --if ansi == nil then return r end
  246. --if ansi[b] == nil then return r end
  247. if utf8_decode[j] then
  248. if utf8_decode[j][b] then
  249. a, r = a - 1, r .. utf8_decode[j][b]
  250. end
  251. end
  252. elseif b == 226 then
  253. a = 2
  254. elseif b == 194 or b == 208 or b == 209 or b == 210 then
  255. j, a = b, 1
  256. else
  257. r = r .. "_"
  258. end
  259. end
  260. return r
  261. end