📄 smsunicode.cpp
字号:
#include <windows.h>
#include <string.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include "sms.h"
/*定义 unicode解码 数据结构*/
struct TYP_CODE
{
unsigned short qwcode;//机内码
unsigned short unicode;
};
TYP_CODE code_qw_unicode[24000];
TYP_CODE code_unicode_qw[24000];
int code_qwunicode_num = 0;
/*
//uincode 解码函数声明
int creat_code_table(char* FileName);
unsigned short unicode2qw_convert(unsigned short unicode_value);
unsigned short qw2unicode_convert(unsigned short qw_value);
void String_uni2qw_convert(void *ptr_unicode_string, unsigned char string_len);
void String_qw2Uni_convert(void *ptr_qw_string, int *str_uni_len);
void String_octet2ascii(char *ptr_string, int string_len);
void String_ascii2octet(char *ptr_string, int string_len);
*/
//创建文本编码转换表
int creat_code_table(char* FileName)
{
FILE *fp;
char file_line_buf[1024],path[1024];
int i,j;
unsigned short gb_value,unicode_value;
memset(file_line_buf,0,1024);
//strcpy(path,mms_file_default_path);
strcpy(path, FileName);
if(fp=fopen(path,"r"))
{
j=0;
while(!feof(fp))
{
i=0;
while(!feof(fp))
{
file_line_buf[i]=fgetc(fp);
if(file_line_buf[i]==0x0a)
{
if(file_line_buf[0]=='0')
{
if(file_line_buf[2]>='0'&&file_line_buf[2]<='9')
gb_value=(file_line_buf[2]-'0')*4096;
else
{
if(file_line_buf[2]>='a'&&file_line_buf[2]<='f')
gb_value=(file_line_buf[2]-'a'+10)*4906;
else gb_value=(file_line_buf[2]-'A'+10)*4906;
}
if(file_line_buf[3]>='0'&&file_line_buf[3]<='9')
gb_value+=(file_line_buf[3]-'0')*256;
else
{
if(file_line_buf[3]>='a'&&file_line_buf[3]<='f')
gb_value+=(file_line_buf[3]-'a'+10)*256;
else gb_value+=(file_line_buf[3]-'A'+10)*256;
}
if(file_line_buf[4]>='0'&&file_line_buf[4]<='9')
gb_value+=(file_line_buf[4]-'0')*16;
else
{
if(file_line_buf[4]>='a'&&file_line_buf[4]<='f')
gb_value+=(file_line_buf[4]-'a'+10)*16;
else gb_value+=(file_line_buf[4]-'A'+10)*16;
}
if(file_line_buf[5]>='0'&&file_line_buf[5]<='9')
gb_value+=(file_line_buf[5]-'0');
else
{
if(file_line_buf[5]>='a'&&file_line_buf[5]<='f')
gb_value+=(file_line_buf[5]-'a'+10);
else gb_value+=(file_line_buf[5]-'A'+10);
}
code_qw_unicode[j].qwcode=gb_value+0x8080;
if(file_line_buf[9]>='0'&&file_line_buf[9]<='9')
unicode_value=(file_line_buf[9]-'0')*4096;
else
{
if(file_line_buf[9]>='a'&&file_line_buf[9]<='f')
unicode_value=(file_line_buf[9]-'a'+10)*4906;
else unicode_value=(file_line_buf[9]-'A'+10)*4906;
}
if(file_line_buf[10]>='0'&&file_line_buf[10]<='9')
unicode_value+=(file_line_buf[10]-'0')*256;
else
{
if(file_line_buf[10]>='a'&&file_line_buf[10]<='f')
unicode_value+=(file_line_buf[10]-'a'+10)*256;
else unicode_value+=(file_line_buf[10]-'A'+10)*256;
}
if(file_line_buf[11]>='0'&&file_line_buf[11]<='9')
unicode_value+=(file_line_buf[11]-'0')*16;
else
{
if(file_line_buf[11]>='a'&&file_line_buf[11]<='f')
unicode_value+=(file_line_buf[11]-'a'+10)*16;
else unicode_value+=(file_line_buf[11]-'A'+10)*16;
}
if(file_line_buf[12]>='0'&&file_line_buf[12]<='9')
unicode_value+=(file_line_buf[12]-'0');
else
{
if(file_line_buf[12]>='a'&&file_line_buf[12]<='f')
unicode_value+=(file_line_buf[12]-'a'+10);
else unicode_value+=(file_line_buf[12]-'A'+10);
}
code_qw_unicode[j].unicode=unicode_value;
code_unicode_qw[j].unicode=code_qw_unicode[j].unicode;
code_unicode_qw[j].qwcode=code_qw_unicode[j].qwcode;
j++;
}
break;
}
i++;
}
}
code_qwunicode_num=j;
for(i=0;i<code_qwunicode_num;i++)
{
for(j=0;j<code_qwunicode_num-i-1;j++)
{
if(code_unicode_qw[j].unicode>code_unicode_qw[j+1].unicode)
{
unicode_value=code_unicode_qw[j].unicode;
code_unicode_qw[j].unicode=code_unicode_qw[j+1].unicode;
code_unicode_qw[j+1].unicode=unicode_value;
gb_value=code_unicode_qw[j].qwcode;
code_unicode_qw[j].qwcode=code_unicode_qw[j+1].qwcode;
code_unicode_qw[j+1].qwcode=gb_value;
}
}
}
for(i=0;i<code_qwunicode_num;i++)
{
for(j=0;j<code_qwunicode_num-i-1;j++)
{
if(code_qw_unicode[j].qwcode>code_qw_unicode[j+1].qwcode)
{
unicode_value=code_qw_unicode[j].unicode;
code_qw_unicode[j].unicode=code_qw_unicode[j+1].unicode;
code_qw_unicode[j+1].unicode=unicode_value;
gb_value=code_qw_unicode[j].qwcode;
code_qw_unicode[j].qwcode=code_qw_unicode[j+1].qwcode;
code_qw_unicode[j+1].qwcode=gb_value;
}
}
}
if(fp)fclose(fp);
}
else
{
printf("\nERROR:cannot open gb2312.txt\n");
return -1;
}
return 0;
}
//Unicode到内码的的转换,single symbol
unsigned short unicode2qw_convert(unsigned short unicode_value)
{
int i=0, j=code_qwunicode_num-1;
if(unicode_value<code_unicode_qw[i].unicode || unicode_value>code_unicode_qw[j].unicode)
return 0;
while((i+1)<j)
{
if(unicode_value==code_unicode_qw[i].unicode) return code_unicode_qw[i].qwcode;
if(unicode_value==code_unicode_qw[j].unicode) return code_unicode_qw[j].qwcode;
if(unicode_value==code_unicode_qw[i+(j-i)/2].unicode) return code_unicode_qw[i+(j-i)/2].qwcode;
else
{
if(unicode_value<code_unicode_qw[i+(j-i)/2].unicode) j=i+(j-i)/2;
else i=i+(j-i)/2;
}
}
if(unicode_value==code_unicode_qw[i].unicode) return code_unicode_qw[i].qwcode;
else
{
if(unicode_value==code_unicode_qw[j].unicode) return code_unicode_qw[j].qwcode;
else return 0;
}
}
//内码到Unicode的转换,single symbol
unsigned short qw2unicode_convert(unsigned short qw_value)
{
int i=0,j=code_qwunicode_num-1;
if(qw_value<code_qw_unicode[i].qwcode||qw_value>code_qw_unicode[j].qwcode)
return 0;
while((i+1)<j)
{
if(qw_value==code_qw_unicode[i].qwcode)return code_qw_unicode[i].unicode;
if(qw_value==code_qw_unicode[j].qwcode)return code_qw_unicode[j].unicode;
if(qw_value==code_qw_unicode[i+(j-i)/2].qwcode)return code_qw_unicode[i+(j-i)/2].unicode;
else
{
if(qw_value<code_qw_unicode[i+(j-i)/2].qwcode) j=i+(j-i)/2;
else i=i+(j-i)/2;
}
}
if(qw_value==code_qw_unicode[i].qwcode)return code_qw_unicode[i].unicode;
else
{
if(qw_value==code_qw_unicode[j].qwcode)return code_qw_unicode[j].unicode;
else return 0;
}
}
//unicode到内码的转换,string
void String_uni2qw_convert(void *ptr_unicode_string, unsigned char string_len)
{
unsigned char *p=(unsigned char *)ptr_unicode_string;
int i=0,j=0;
unsigned short temp_value;
unsigned char temp_buf[160];
while(i < string_len)
{
if(p[i] == 0)
{
i++;
if(p[i] == 0)
{
temp_buf[j]=0;
strcpy((char*)p, (char*)temp_buf);
return ;
}
temp_buf[j++]=p[i++];
}
else
{
temp_value=p[i]*256 + p[i+1];
i += 2;
temp_value=unicode2qw_convert(temp_value);
temp_buf[j++]=temp_value/256;
temp_buf[j++]=temp_value&0xff;
}
}
temp_buf[j]=0;
strcpy((char *)p, (char *)temp_buf);
return;
}
//内码到unicode的转换,string
void String_qw2Uni_convert(void *ptr_qw_string, int *str_uni_len)
{
unsigned char *p=(unsigned char *)ptr_qw_string;
int i=0,j=0;
unsigned short temp_value;
unsigned char temp_buf[160];
while(p[i]!=0)
{
if(p[i]<=0x7f)
{
temp_buf[j++]=0;
temp_buf[j++]=p[i++];
}
else
{
if(p[i+1]>0x7f)
{
temp_value=p[i]*256+p[i+1];
i+=2;
temp_value=qw2unicode_convert(temp_value);
temp_buf[j++]=temp_value/256;
temp_buf[j++]=temp_value&0xff;
}
else
{
temp_buf[j]=0;
memcpy((char *)p, (char *)temp_buf, j);
*str_uni_len = j;
return;
}
}
}
temp_buf[j]=0;
memcpy((char *)p, (char *)temp_buf, j);
*str_uni_len = j;
return;
}
void String_octet2ascii(char *ptr_string, int string_len)
{
char charTemp[512];
unsigned char temp = 0;
int i = 0, j = 0;
for(i = 0; i < string_len; i++)
{
temp = ptr_string[i]>>4;
if(temp > 9)
{
charTemp[j++] = 'a' + temp -10;
}
else
{
charTemp[j++] = '0' + temp;
}
temp = ptr_string[i]&0xf;
if(temp > 9)
{
charTemp[j++] = 'a' + temp -10;
}
else
{
charTemp[j++] = '0' + temp;
}
}
strcpy(ptr_string, charTemp);
return;
}
void String_ascii2octet(char *ptr_string, int string_len)
{
char charTemp[512];
int i = 0;
for(i = 0; i < string_len; i++)
{
if((ptr_string[i] >= '0')&&(ptr_string[i] <= '9'))
{
charTemp[i/2] = (ptr_string[i] - '0')<<4;
}
else //'a'-----'f'
{
charTemp[i/2] = (ptr_string[i] - 'a')<<4;
}
if((ptr_string[i+1] >= '0')&&(ptr_string[i+1] <= '9'))
{
charTemp[i/2] |= (ptr_string[i] - '0');
}
else //'a'-----'f'
{
charTemp[i/2] |= (ptr_string[i] - 'a');
}
}
strncpy(ptr_string, charTemp, i/2);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -