convert.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package door
  2. import "strings"
  3. // I used iconv in door++, but it was horrible. It doesn't translate
  4. // control codes to Unicode.
  5. // This converts CP437 to Unicode for rendering in Unicode terminals
  6. // like the linux telnet client.
  7. // This does everything but: \x07, \x08, \x0a and \x0d.
  8. // 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x1b (ANSI spec)
  9. func CP437_to_Unicode(cp437 string) string {
  10. // var result string
  11. var result strings.Builder
  12. result.Grow(len(cp437))
  13. for _, char := range []byte(cp437) {
  14. // for _, char := range []rune(cp437) {
  15. switch int(char) {
  16. case 0x01:
  17. result.WriteRune('\u263A')
  18. case 0x02:
  19. result.WriteRune('\u263B')
  20. case 0x03:
  21. result.WriteRune('\u2665')
  22. case 0x04:
  23. result.WriteRune('\u2666')
  24. case 0x05:
  25. result.WriteRune('\u2663')
  26. case 0x06:
  27. result.WriteRune('\u2660')
  28. case 0x09:
  29. result.WriteRune('\u25CB')
  30. case 0x0b:
  31. result.WriteRune('\u2642')
  32. case 0x0c:
  33. result.WriteRune('\u2640')
  34. case 0x0e:
  35. result.WriteRune('\u266B')
  36. case 0x0f:
  37. result.WriteRune('\u263C')
  38. case 0x10:
  39. result.WriteRune('\u25BA')
  40. case 0x11:
  41. result.WriteRune('\u25C4')
  42. case 0x12:
  43. result.WriteRune('\u2195')
  44. case 0x13:
  45. result.WriteRune('\u203C')
  46. case 0x14:
  47. result.Write([]byte{0xc2, 0xb6})
  48. case 0x15:
  49. result.Write([]byte{0xc2, 0xa7})
  50. case 0x16:
  51. result.WriteRune('\u25AC')
  52. case 0x17:
  53. result.WriteRune('\u21A8')
  54. case 0x18:
  55. result.WriteRune('\u2191')
  56. case 0x19:
  57. result.WriteRune('\u2193')
  58. case 0x1a:
  59. result.WriteRune('\u2192')
  60. case 0x1c:
  61. result.WriteRune('\u221F')
  62. case 0x1d:
  63. result.WriteRune('\u2194')
  64. case 0x1e:
  65. result.WriteRune('\u25B2')
  66. case 0x1f:
  67. result.WriteRune('\u25BC')
  68. case 0x7f:
  69. result.WriteRune('\u2302')
  70. case 0x80:
  71. result.Write([]byte{0xc3, 0x87})
  72. case 0x81:
  73. result.Write([]byte{0xc3, 0xbc})
  74. case 0x82:
  75. result.Write([]byte{0xc3, 0xa9})
  76. case 0x83:
  77. result.Write([]byte{0xc3, 0xa2})
  78. case 0x84:
  79. result.Write([]byte{0xc3, 0xa4})
  80. case 0x85:
  81. result.Write([]byte{0xc3, 0xa0})
  82. case 0x86:
  83. result.Write([]byte{0xc3, 0xa5})
  84. case 0x87:
  85. result.Write([]byte{0xc3, 0xa7})
  86. case 0x88:
  87. result.Write([]byte{0xc3, 0xaa})
  88. case 0x89:
  89. result.Write([]byte{0xc3, 0xab})
  90. case 0x8a:
  91. result.Write([]byte{0xc3, 0xa8})
  92. case 0x8b:
  93. result.Write([]byte{0xc3, 0xaf})
  94. case 0x8c:
  95. result.Write([]byte{0xc3, 0xae})
  96. case 0x8d:
  97. result.Write([]byte{0xc3, 0xac})
  98. case 0x8e:
  99. result.Write([]byte{0xc3, 0x84})
  100. case 0x8f:
  101. result.Write([]byte{0xc3, 0x85})
  102. case 0x90:
  103. result.Write([]byte{0xc3, 0x89})
  104. case 0x91:
  105. result.Write([]byte{0xc3, 0xa6})
  106. case 0x92:
  107. result.Write([]byte{0xc3, 0x86})
  108. case 0x93:
  109. result.Write([]byte{0xc3, 0xb4})
  110. case 0x94:
  111. result.Write([]byte{0xc3, 0xb6})
  112. case 0x95:
  113. result.Write([]byte{0xc3, 0xb2})
  114. case 0x96:
  115. result.Write([]byte{0xc3, 0xbb})
  116. case 0x97:
  117. result.Write([]byte{0xc3, 0xb9})
  118. case 0x98:
  119. result.Write([]byte{0xc3, 0xbf})
  120. case 0x99:
  121. result.Write([]byte{0xc3, 0x96})
  122. case 0x9a:
  123. result.Write([]byte{0xc3, 0x9c})
  124. case 0x9b:
  125. result.Write([]byte{0xc2, 0xa2})
  126. case 0x9c:
  127. result.Write([]byte{0xc2, 0xa3})
  128. case 0x9d:
  129. result.Write([]byte{0xc2, 0xa5})
  130. case 0x9e:
  131. result.WriteRune('\u20A7')
  132. case 0x9f:
  133. result.WriteRune('\u0192')
  134. case 0xa0:
  135. result.Write([]byte{0xc3, 0xa1})
  136. case 0xa1:
  137. result.Write([]byte{0xc3, 0xad})
  138. case 0xa2:
  139. result.Write([]byte{0xc3, 0xb3})
  140. case 0xa3:
  141. result.Write([]byte{0xc3, 0xba})
  142. case 0xa4:
  143. result.Write([]byte{0xc3, 0xb1})
  144. case 0xa5:
  145. result.Write([]byte{0xc3, 0x91})
  146. case 0xa6:
  147. result.Write([]byte{0xc2, 0xaa})
  148. case 0xa7:
  149. result.Write([]byte{0xc2, 0xba})
  150. case 0xa8:
  151. result.Write([]byte{0xc2, 0xbf})
  152. case 0xa9:
  153. result.WriteRune('\u2310')
  154. case 0xaa:
  155. result.Write([]byte{0xc2, 0xac})
  156. case 0xab:
  157. result.Write([]byte{0xc2, 0xbd})
  158. case 0xac:
  159. result.Write([]byte{0xc2, 0xbc})
  160. case 0xad:
  161. result.Write([]byte{0xc2, 0xa1})
  162. case 0xae:
  163. result.Write([]byte{0xc2, 0xab})
  164. case 0xaf:
  165. result.Write([]byte{0xc2, 0xbb})
  166. case 0xb0:
  167. result.WriteRune('\u2591')
  168. case 0xb1:
  169. result.WriteRune('\u2592')
  170. case 0xb2:
  171. result.WriteRune('\u2593')
  172. case 0xb3:
  173. result.WriteRune('\u2502')
  174. case 0xb4:
  175. result.WriteRune('\u2524')
  176. case 0xb5:
  177. result.WriteRune('\u2561')
  178. case 0xb6:
  179. result.WriteRune('\u2562')
  180. case 0xb7:
  181. result.WriteRune('\u2556')
  182. case 0xb8:
  183. result.WriteRune('\u2555')
  184. case 0xb9:
  185. result.WriteRune('\u2563')
  186. case 0xba:
  187. result.WriteRune('\u2551')
  188. case 0xbb:
  189. result.WriteRune('\u2557')
  190. case 0xbc:
  191. result.WriteRune('\u255D')
  192. case 0xbd:
  193. result.WriteRune('\u255C')
  194. case 0xbe:
  195. result.WriteRune('\u255B')
  196. case 0xbf:
  197. result.WriteRune('\u2510')
  198. case 0xc0:
  199. result.WriteRune('\u2514')
  200. case 0xc1:
  201. result.WriteRune('\u2534')
  202. case 0xc2:
  203. result.WriteRune('\u252C')
  204. case 0xc3:
  205. result.WriteRune('\u251C')
  206. case 0xc4:
  207. result.WriteRune('\u2500')
  208. case 0xc5:
  209. result.WriteRune('\u253C')
  210. case 0xc6:
  211. result.WriteRune('\u255E')
  212. case 0xc7:
  213. result.WriteRune('\u255F')
  214. case 0xc8:
  215. result.WriteRune('\u255A')
  216. case 0xc9:
  217. result.WriteRune('\u2554')
  218. case 0xca:
  219. result.WriteRune('\u2569')
  220. case 0xcb:
  221. result.WriteRune('\u2566')
  222. case 0xcc:
  223. result.WriteRune('\u2560')
  224. case 0xcd:
  225. result.WriteRune('\u2550')
  226. case 0xce:
  227. result.WriteRune('\u256C')
  228. case 0xcf:
  229. result.WriteRune('\u2567')
  230. case 0xd0:
  231. result.WriteRune('\u2568')
  232. case 0xd1:
  233. result.WriteRune('\u2564')
  234. case 0xd2:
  235. result.WriteRune('\u2565')
  236. case 0xd3:
  237. result.WriteRune('\u2559')
  238. case 0xd4:
  239. result.WriteRune('\u2558')
  240. case 0xd5:
  241. result.WriteRune('\u2552')
  242. case 0xd6:
  243. result.WriteRune('\u2553')
  244. case 0xd7:
  245. result.WriteRune('\u256B')
  246. case 0xd8:
  247. result.WriteRune('\u256A')
  248. case 0xd9:
  249. result.WriteRune('\u2518')
  250. case 0xda:
  251. result.WriteRune('\u250C')
  252. case 0xdb:
  253. result.WriteRune('\u2588')
  254. case 0xdc:
  255. result.WriteRune('\u2584')
  256. case 0xdd:
  257. result.WriteRune('\u258C')
  258. case 0xde:
  259. result.WriteRune('\u2590')
  260. case 0xdf:
  261. result.WriteRune('\u2580')
  262. case 0xe0:
  263. result.WriteRune('\u03B1')
  264. case 0xe1:
  265. result.Write([]byte{0xc3, 0x9f})
  266. case 0xe2:
  267. result.WriteRune('\u0393')
  268. case 0xe3:
  269. result.WriteRune('\u03C0')
  270. case 0xe4:
  271. result.WriteRune('\u03A3')
  272. case 0xe5:
  273. result.WriteRune('\u03C3')
  274. case 0xe6:
  275. result.Write([]byte{0xc2, 0xb5})
  276. case 0xe7:
  277. result.WriteRune('\u03C4')
  278. case 0xe8:
  279. result.WriteRune('\u03A6')
  280. case 0xe9:
  281. result.WriteRune('\u0398')
  282. case 0xea:
  283. result.WriteRune('\u03A9')
  284. case 0xeb:
  285. result.WriteRune('\u03B4')
  286. case 0xec:
  287. result.WriteRune('\u221E')
  288. case 0xed:
  289. result.WriteRune('\u03C6')
  290. case 0xee:
  291. result.WriteRune('\u03B5')
  292. case 0xef:
  293. result.WriteRune('\u2229')
  294. case 0xf0:
  295. result.WriteRune('\u2261')
  296. case 0xf1:
  297. result.Write([]byte{0xc2, 0xb1})
  298. case 0xf2:
  299. result.WriteRune('\u2265')
  300. case 0xf3:
  301. result.WriteRune('\u2264')
  302. case 0xf4:
  303. result.WriteRune('\u2320')
  304. case 0xf5:
  305. result.WriteRune('\u2321')
  306. case 0xf6:
  307. result.Write([]byte{0xc3, 0xb7})
  308. case 0xf7:
  309. result.WriteRune('\u2248')
  310. case 0xf8:
  311. result.Write([]byte{0xc2, 0xb0})
  312. case 0xf9:
  313. result.WriteRune('\u2219')
  314. case 0xfa:
  315. result.Write([]byte{0xc2, 0xb7})
  316. case 0xfb:
  317. result.WriteRune('\u221A')
  318. case 0xfc:
  319. result.WriteRune('\u207F')
  320. case 0xfd:
  321. result.Write([]byte{0xc2, 0xb2})
  322. case 0xfe:
  323. result.WriteRune('\u25A0')
  324. case 0xff:
  325. result.Write([]byte{0xc2, 0xa0})
  326. default:
  327. result.WriteByte(byte(char))
  328. }
  329. }
  330. return result.String()
  331. }