unicode.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. #include "includes.h"
  2. #include "unicode.h"
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #define GB2312_TO_UNICODE_BASE 0x134000 //起始地址?
  8. #define UNICODE_TO_GB2312_BASE 0x138000
  9. extern const uint16_t GB2312_UNICODE_MAP[];
  10. //extern unsigned short giGB2312[21243][2];
  11. //const unsigned short giGBCount=21243;
  12. typedef struct {
  13. uint16_t unicode;
  14. uint16_t gb2312;
  15. } unicode_gb2312_map_t;
  16. extern const unicode_gb2312_map_t UNICODE_GB2312_MAP[];
  17. /*
  18. MIN_CODE = $A1A1;
  19. MAX_CODE = $F7FE;
  20. */
  21. #define GB2312_CODE_ZONE_MIN 0xA1
  22. #define GB2312_CODE_ZONE_MAX 0xF7
  23. #define GB2312_CODE_POS_MIN 0xA1
  24. #define GB2312_CODE_POS_MAX 0xFE
  25. // high = (GB2312_CODE_ZONE_MAX - GB2312_CODE_ZONE_MIN + 1) *
  26. // (GB2312_CODE_POS_MAX - GB2312_CODE_POS_MIN + 1);
  27. uint16_t
  28. GB2312_to_Unicode(uint16_t c)
  29. {
  30. uint8_t zone, pos;
  31. uint32_t offset;
  32. uint16_t retval;
  33. // printf("%2x/r",c);
  34. zone = c >> 8;
  35. pos = c & 0xFF;
  36. // printf("%2x-/r",zone);
  37. // printf("%2x--/r",pos);
  38. if ((zone > GB2312_CODE_ZONE_MAX) ||
  39. (zone < GB2312_CODE_ZONE_MIN) ||
  40. (pos > GB2312_CODE_POS_MAX) ||
  41. (pos < GB2312_CODE_POS_MIN))
  42. {
  43. return c;
  44. }
  45. offset = (zone - GB2312_CODE_ZONE_MIN) * (GB2312_CODE_POS_MAX - GB2312_CODE_POS_MIN + 1) +
  46. (pos - GB2312_CODE_POS_MIN);
  47. //spiFlashBlockRead(GB2312_TO_UNICODE_BASE + offset * 2, (uint8_t *)&retval, 2);
  48. retval=GB2312_UNICODE_MAP[offset];//offset*2
  49. return retval;
  50. }
  51. uint16_t
  52. Unicode_to_GB2312(uint16_t c)
  53. {
  54. int offset;
  55. int low, high, mid;
  56. //const
  57. unicode_gb2312_map_t map;
  58. if (((c >> 8) == 0) && ((c & 0xFF) < 0x7F))
  59. {
  60. return c;
  61. }
  62. low = 0;
  63. mid = 0;
  64. high = (GB2312_CODE_ZONE_MAX - GB2312_CODE_ZONE_MIN + 1) *
  65. (GB2312_CODE_POS_MAX - GB2312_CODE_POS_MIN + 1);
  66. while (low <= high)
  67. {
  68. mid = (low + high) / 2;
  69. ReadFileData(UniToGBKIndex, mid * sizeof(unicode_gb2312_map_t),sizeof(unicode_gb2312_map_t),(uint8_t *)&map);
  70. //map = & UNICODE_GB2312_MAP[mid];
  71. if (c > map.unicode)
  72. {
  73. low = mid + 1;
  74. }
  75. if (c < map.unicode)
  76. {
  77. high = mid - 1;
  78. }
  79. if (c == map.unicode)
  80. {
  81. return map.gb2312;
  82. }
  83. }
  84. return '?'; // 无法识别,替换为 ?
  85. }
  86. uint16_t
  87. Ansi_to_Unicode(uint16_t *dest, uint16_t size, const uint8_t *src, uint16_t length) //GBK_Unicode
  88. {
  89. uint16_t count = 0;
  90. while((count < size) && length)
  91. {
  92. if ((*src > 0x7F) && (length > 1))
  93. {
  94. dest[count] = GB2312_to_Unicode(((uint16_t)src[0] << 8) | src[1]);
  95. src += 2;
  96. length -= 2;
  97. }
  98. else
  99. {
  100. dest[count] = *src;
  101. src++;
  102. length--;
  103. }
  104. ++count;
  105. }
  106. return count;
  107. }
  108. uint16_t
  109. Unicode_to_Ansi(uint8_t *dest, uint16_t size, const uint8_t *src, uint16_t length) //
  110. {
  111. uint16_t count = 0;
  112. uint16_t t;
  113. while((count + 1 < size) && length)
  114. {
  115. t = Unicode_to_GB2312(((uint16_t)src[1] << 8) | src[0]);
  116. if ((t >> 8) == 0)
  117. {
  118. *dest++ = t;
  119. ++count;
  120. }
  121. else
  122. {
  123. *dest++ = t >> 8;
  124. *dest++ = t;
  125. count += 2;
  126. }
  127. src += 2;
  128. length -= 2;
  129. }
  130. *dest++ = 0;
  131. return count;
  132. }
  133. /**************************************************************************************
  134. 将字符形式的Unicode转为Ansi
  135. 比如:字符串“d89ea48ba47fc47e0000”将转为 "默认群组"
  136. ***************************************************************************************/
  137. uint16_t StrUnicodeToAnsi(uint8_t *dest,uint16_t size,const char *src)
  138. {
  139. #if 1
  140. uint16_t count = 0;
  141. uint16_t t;
  142. int length;
  143. uint16_t v;
  144. char temp[5];
  145. length=strlen(src);
  146. if(length<4) return 0;
  147. memset(dest,0,size);
  148. while((count + 1 < size) && length>0)
  149. {
  150. temp[0]=src[2];temp[1]=src[3]; //{0x00A4, 0xA1E8},00A4 其实要变成A400 倒过来
  151. temp[2]=src[0];temp[3]=src[1];
  152. temp[4]=0;
  153. v=strtol(temp,NULL,16);
  154. t = Unicode_to_GB2312(v);
  155. if ((t >> 8) == 0)
  156. {
  157. *dest++ = t;
  158. ++count;
  159. }
  160. else
  161. {
  162. *dest++ = t >> 8;
  163. *dest++ = t;
  164. count += 2;
  165. }
  166. src += 4;
  167. length -= 4;
  168. }
  169. *dest++ = 0;
  170. return count;
  171. #endif
  172. }
  173. /**************************************************************************************
  174. 将字符串转字符串形式的StrUnicode
  175. 比如:字符串"默认群组"(8字节) 转为 “d89ea48ba47fc47e”(16字节)默认群组的Unicode就是
  176. d89ea48ba47fc47e {0x6DF1, 0xC9EE},
  177. ***************************************************************************************/
  178. //uint16_t
  179. //GB_to_UN(uint16_t c)
  180. //{
  181. // uint8_t zone, pos;
  182. // int offset;
  183. // int low, high, mid;
  184. // const unicode_gb2312_map_t *map;
  185. // if (((c >> 8) == 0) && ((c & 0xFF) < 0x7F))
  186. // {
  187. // return c;
  188. // }
  189. // printf("%2x--/r",c);
  190. // low = 0;
  191. // high = (GB2312_CODE_ZONE_MAX - GB2312_CODE_ZONE_MIN + 1) * //8178
  192. // (GB2312_CODE_POS_MAX - GB2312_CODE_POS_MIN + 1);
  193. // while (low <= high)
  194. // {
  195. // mid = (low + high) / 2;
  196. // map = &UNICODE_GB2312_MAP[mid];
  197. //
  198. // if (c > map->gb2312)
  199. // {
  200. // low = mid + 1;
  201. // }
  202. // if (c < map->gb2312)
  203. // {
  204. // high = mid - 1;
  205. // }
  206. // if (c == map->gb2312)
  207. // {
  208. // return map->unicode;
  209. // }
  210. // }
  211. // return '?'; // 无法识别,替换为 ?
  212. //}
  213. ///**************************************************************************/
  214. //uint16_t AnsiToStrUnicode(uint16_t *dest,uint16_t size,const char *src)
  215. //{
  216. // uint16_t count = 0;
  217. // uint16_t t;
  218. // int length;
  219. // uint16_t v;
  220. // char temp[5];
  221. //
  222. //
  223. // length=strlen(src);
  224. // if(length<2) return 0; //因为后面只留2个0 c9eedbdab0eccac2b4a6 00
  225. // memset(dest,0,size);
  226. // printf("%2x/n-->",*src);
  227. //
  228. // while((count < size) && length>0)
  229. // {
  230. // temp[0]=src[0];temp[1]=src[1]; //{0x6DF1, 0xC9EE},
  231. // temp[2]=src[2];temp[3]=src[3];
  232. // temp[4]=0;
  233. // v=strtol(temp,NULL,16);
  234. // printf("%2x/n->",v);
  235. // if ((v > 0x7F)&& (length > 1)) //(*src > 0x7F) &&
  236. // {
  237. // dest[count] = GB_to_UN(v);
  238. // printf("%2x/n/r",dest[count]);
  239. // src += 4;
  240. // length -= 4;
  241. // }else{
  242. // dest[count] = *src;
  243. // src++;
  244. // length--;
  245. //
  246. // }
  247. // ++count;
  248. // }
  249. //
  250. // return count;
  251. //}
  252. /********************************************************************************/
  253. uint16_t AnsiToStrUnicode(uint16_t *dest,uint16_t size,const char *src)
  254. {
  255. //#if 1
  256. // uint16_t count = 0;
  257. // uint16_t t,v;
  258. // int length;
  259. // char temp[5];
  260. //
  261. // unsigned char t1,t2;
  262. // length=strlen(src);
  263. // if(length<2) return 0; //因为后面只留2个0 c9eedbdab0eccac2b4a6 00
  264. //
  265. // memset(dest,0,size); //初始化目标
  266. // while((count < size) && length)
  267. // {
  268. // if(src[0] == 0x30 && src[1] == 0x30) return count;
  269. // temp[0]=src[0];temp[1]=src[1];
  270. // temp[2]=src[2];temp[3]=src[3];
  271. // temp[4]=0;
  272. // v=strtol(temp,NULL,16);
  273. // t1=v&0xff;
  274. // t2=(v>>8)&0xff;
  275. // if((t1 > 0x7F) && (t2 > 0x7f) && (length > 1))
  276. // {
  277. // dest[count] = GB2312_to_Unicode(v);
  278. // src += 4;
  279. // length -= 4;
  280. // }
  281. // else
  282. // {
  283. // t=t2;
  284. // t &= 0xff;
  285. // dest[count] = t;
  286. // src +=2;
  287. // length -=2;
  288. // }
  289. // ++count;
  290. // }
  291. // return 0;
  292. //#else
  293. // uint16_t count = 0;
  294. // uint16_t t,v;
  295. // int length;
  296. // char temp[5];
  297. // length=strlen(src);
  298. // if(length<2) return 0; //因为后面只留2个0 c9eedbdab0eccac2b4a6 00
  299. //
  300. // memset(dest,0,size); //初始化目标
  301. // g_GroupNameLen=0;
  302. //// printf("%2x/n-->",*src);
  303. // while((count < size) && length)
  304. // {
  305. // temp[0]=src[0];temp[1]=src[1];
  306. // temp[2]=src[2];temp[3]=src[3];
  307. // temp[4]=0;
  308. // v=strtol(temp,NULL,16);
  309. //// printf("%2x/n->",v);
  310. // if(v!=0){g_GroupNameLen++;}else{return 0;}
  311. // if ((v > 0x7F)&&((v>>8) > 0x7F) && (length > 1)) // if ((v > 0x7F)&& (length > 1))
  312. // {
  313. // dest[count] = GB2312_to_Unicode(v);
  314. //// printf("%2x/n/r", dest[count]);
  315. // src += 4;
  316. // length -= 4;
  317. // }
  318. // else
  319. // {
  320. // dest[count] = *src;
  321. // src++;
  322. // length--;
  323. // }
  324. // ++count;
  325. // }
  326. // return 0;
  327. //#endif
  328. }