def_2 发表于 2013-7-16 12:01:16

请问用51单片机怎么将unicode码转换成GB2312码?

我现在要用到GB2312码,不过串口的数据是U码,现在涉及到将U码转化成GB码的问题。

在网上查了一些资料,有的是用查表的方法得到的,但是在51单片机中的可行度好像不大,因为那个映射表的数组非常庞大

请问各位大神是怎么做到的,将U码转化成GB码,有现成的芯片吗?或提供下程序,不胜感激~~~

def_2 发表于 2013-7-16 12:03:04

望大家帮忙。。。{:hug:}{:hug:}{:hug:}

cheungman 发表于 2013-7-16 13:14:49

UNICODE转GBK 映射表有128K, 可以的话, 找个SPI FLASH存~

takashiki 发表于 2013-7-16 14:01:53

映射方式不是顺序映射的,只能查表。
要速度快就以Unicode作为基础做一个大表,占用Flash 128K。
要占用Flash小就以GB2312为基础做一个表,占用大概Flash 15K,再挨个搜索。
想再小一点就把GB2312后面的二级汉字单独提取出来做个小表,存储差分后的Unicode编码,按差分后每个占用1字节计,占用Flash大约11K。
更小一点,直接把二级汉字干掉,只占大约7K的Flash空间,超出部分全部用XXX代替,哈哈。

Appcat 发表于 2013-7-16 14:04:35

既然51内部放不下,外部还要扩展FLASH,就不如用个国通的GT21系列的字库芯片,里边可以直接进行GB2312与UNICODE进行转换,I2C接口的很方便。

i55x 发表于 2013-7-16 14:10:17

如果只是转其中一个很小的子集,比如英文用51还能做,如果是全转51就太吃力了,换stm32吧。

why1220 发表于 2013-7-16 14:37:03

iconv是开源的可参考http://www.gnu.org/software/libiconv/,里面有一大堆如gb2312.h,gbk.h一类的头文件,正如你所说里面有很多很大的数组,用于查表,可以把这些源文件拿编译出来,放到SD卡或flash存储芯片中,通过SPI接口进行查表操作进行转换!

devcang 发表于 2013-7-18 08:50:17

強的單片機                   應該可以做到的

dadongleilei 发表于 2013-7-18 15:21:10

基本上都得查表,51里没有什么函数可以直接转换的

sheik 发表于 2013-7-18 16:34:52

本帖最后由 sheik 于 2013-7-18 16:36 编辑

Unicode转GB2312编码

vtte 发表于 2013-7-18 16:40:09

从上位机想办法,不该单片机干的事一律不要给他干

yuxiao23Am 发表于 2013-7-19 11:45:26

查表吧....单片机够大就能用

LBQ691477940 发表于 2013-7-19 13:09:46

好像有人用二分查表

STEVEN.PANG 发表于 2013-7-19 13:24:18

参考FATFS中的CC936.C

tim 发表于 2013-7-19 13:29:15

只能查表吧

菜包 发表于 2013-7-19 14:22:00

用字库芯片

mcu_mouse 发表于 2013-7-19 15:36:27

用个AT45DB041.把那个二分表存入存储芯片。由单片机查找就好。我们就是这么弄地

def_2 发表于 2013-7-20 15:34:21

Appcat 发表于 2013-7-16 14:04 static/image/common/back.gif
既然51内部放不下,外部还要扩展FLASH,就不如用个国通的GT21系列的字库芯片,里边可以直接进行GB2312与UNI ...

我用的就是高通的字库芯片GT21H16S2Y,请问怎么用这块芯片怎么将UNICODE 转换 GB2312 ?可以给个程序或者具体说明吗?

electricit 发表于 2013-7-20 16:27:06

本帖最后由 electricit 于 2013-7-20 16:29 编辑

论坛里有这个代码的,长度也就几行,用查表根本就是害人的

electricit 发表于 2013-7-20 16:30:31

网上找的随便看,没测试
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int H2D(char c){
switch (toupper(c))
{
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
}
return (c-'0');
}

unsigned short tbl;
void u2gb(unsigned char *u,unsigned char *gb){
int i,j=0;
unsigned char l,h;
for(i=0;i<=strlen(u);){
l=u;
h=u;
if(l==0 && h==0) break;
if(l<0xA4 && h<=0){
   gb=l;
   continue;
}
gb=tbl/0x100;
gb=tbl%0x100;
}
gb=0;
}

int init_u2gb(){
FILE *fd;
int size;
char buffer;
memset(tbl,'\0',sizeof(tbl));
fd = fopen("code1.txt","r");
if(fd==NULL) return -1;
while(!feof(fd)){
fread(buffer,sizeof(buffer),1,fd);
tbl)*0x1000+H2D(buffer)*0x100+H2D(buffer)*0x10+H2D(buffer)] =
   H2D(buffer)*0x1000+H2D(buffer)*0x100+H2D(buffer)*0x10+H2D(buffer);
}
close(fd);
return 0;
}
int main(int argc, char *argv[])
{
unsigned char u,gb;
memset(u,'\0',sizeof(u));
memset(gb,'\0',sizeof(gb));
init_u2gb();
strcpy(u,"0");
strcat(u,"\0\0");
u2gb(u,gb);
printf("%s\n",gb);
scanf("%s",u);
}


Appcat 发表于 2013-7-22 09:44:38

def_2 发表于 2013-7-20 15:34 static/image/common/back.gif
我用的就是高通的字库芯片GT21H16S2Y,请问怎么用这块芯片怎么将UNICODE 转换 GB2312 ?可以给个程序或者 ...

芯片的手册20~22页不就是互转的源代码吗?

mainbp 发表于 2015-1-16 10:25:14

现在用这个片子,显示出来的汉字总是缺胳膊少腿,搞死我了,还没整好
页: [1]
查看完整版本: 请问用51单片机怎么将unicode码转换成GB2312码?