精华内容
下载资源
问答
  • utf8转gb2312

    2020-10-18 17:36:12
    从微信小程序上下发的数据为utf8格式,而stm32的格式为gb2312,需要进行编码转换,utf8中文字符串转换为gb2312,devcpp和stm32验证通过
  • 制作UTF8转GB2312转换库

    2017-09-23 13:10:20
    UTF8转GB2312由于工作中要适配佳博58系列的热敏打印机,而目前开发驱动打印的产品采用的字符编码格式是UTF8,而查看手册时发现该打印机采用的是GB2312格式编码的,若UTF8编码格式直接打印输出中文或全角符号,则是一...

    UTF8转GB2312

    由于工作中要适配佳博58系列的热敏打印机,而目前开发驱动打印的产品采用的字符编码格式是UTF8,而查看手册时发现该打印机采用的是GB2312格式编码的,若UTF8编码格式直接打印输出中文或全角符号,则是一堆乱码,于是需要转换格式,网上可用的开源库有libiconv。移植过后发现该库对于我的产品来说略显大。而我只需要UTF8转GB2312,于是准备自己动手。
    链接:https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz 移植过程网上自行百度。

    知识点:

    • UTF8是UNICODE的子集,因此它们之间是有着对应关系
    • UNICODE与GB2312并无对应关系,因此需要建立对应关系表
    • UTF8格式属于变长编码格式长度1-6字节,GB2312属于定长编码格式1-2字节(其中1字节区属于ASCII编码区域)

    UTF8与UNICODE之间的关系如下:
    U-00000000 - U-0000007F: 0xxxxxxx
    U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
    U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
    U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    首字节有几个1就代表此UTF8格式编码是由几个字节编码的。(若是首字节是0则代表为ASCII码)
    转换过程核心点在于此。

    因此判断有几个1则使用以下代码:

    int GetUtf8ChNum(unsigned char first)
    {
        unsigned char tmp = 0x80;
        int count = 0;
    
        while(tmp & first)
        {
            count++;
            tmp = (tmp >> 1);
        }
        return count;
    }

    查表函数如下(经典二分法,速度非常块)

    #define GB2312CodeSize 21791//GB2312编码此大小固定值
    unsigned short SearchCode(unsigned short unicodeVal)
    {
        int first = 0;
        int end = GB2312CodeSize - 1;
        int mid = 0;
        while(first <= end)
        {
            mid = (first + end) / 2;
            if(code_table[mid].unicode == unicodeVal)
            {
                return code_table[mid].gb;
            }
            else if(code_table[mid].unicode > unicodeVal)
            {
                end = mid - 1;
            }
            else 
            {
                first = mid + 1;
            }
        }
        return 0;
    }

    UTF8最大有6个字节编码,GB2312最大2个字节编码,而GB2312在UTF8所处的编码区间是3个字节的区间因此就根据返回值处理3个字节和1个字节的UTF8的编码即可。

    void Utf8ToGb2312(const unsigned char* utf8, unsigned char *gb2312, int len)
    {
        int i = 0;
        int j = 0;
        int Count = 0;
    
        u16 unicodeVal = 0;
        u16 gb2312Val = 0;
    
        //循环查表找出对应GB2312码
        while(i < len)
        {   
            switch(GetUtf8ChNum(utf8[i]))
            {
                case 0:
                    gb2312[j] = utf8[i];
                    Count = 1;
                    break;
                case 2:
                    gb2312[j] = utf8[i];
                    gb2312[j + 1] = utf8[i + 1];
                    Count = 2;
                    break;
                case 3://UTF8->Unicode
                    gb2312[j + 1] = ((utf8[i] & 0x0F) << 4) | ((utf8[i + 1] >> 2) & 0x0F);
                    gb2312[j] = ((utf8[i + 1] & 0x03) << 6) + (utf8[i + 2] & 0x3F);
    
                    memcpy(&unicodeVal, (gb2312 + j), 2);//取Unicode值
                    gb2312Val = SearchCode(unicodeVal);//根据unicodeVal值查表取得对应的GB2312值
    
                    if (gb2312Val != 0)//gb2312有值表示查到表中对应编码,转换大小端以适应我的设备
                    {
                        gb2312Val = (gb2312Val >> 8) | (gb2312Val << 8);
                        memcpy((gb2312 + j), &gbKey, 2);
                    }
                    Count = 3;
                    break;
                case 4:
                    Count = 4;
                    break;
                case 5:
                    Count = 5;
                    break;
                case 6:
                    Count = 6;
                    break;
                default:
                    printf("Unknown code, len > 6\n");
                    break;    
            }
            i += Count;
            if (Count == 1)
            {
                j++;
            }
            else
            {
                j += 2;
            }
        }
    }
    

    附录:表的格式,本次是作为头文件包含。

    网上的格式是这样:

    unicode GB2312
    00A4     A1E8
    00A7     A1EC
    00A8     A1A7
    00B0     A1E3
    ............
    此处省略N行
    ............
    FFE0     A1E9
    FFE1     A1EA
    FFE3     A3FE
    FFE5     A3A4

    链接http://blog.csdn.net/longronglin/article/details/1355890

    头文件中排序之后是这样:

    typedef struct unicode_gb
    {
       unsigned short unicode;
       unsigned short gb;
    } UNICODE_GB;
    
    UNICODE_GB code_table[] = {
    {0x00A4,0xA1E8},
    {0x00A7,0xA1EC},
    {0x00A8,0xA1A7},
    ......
    此处省略N行
    ......
    {0xFFE2,0xA956},
    {0xFFE3,0xA3FE},
    {0xFFE4,0xA957},
    {0xFFE5,0xA3A4}
    };

    源文件大小:
    这里写图片描述
    再编译成库,大小感人:
    这里写图片描述

    再看看libiconv-1.15.tar.gz编译出来的库大小:
    这里写图片描述
    一个1.3M

    验证库:
    自此打印机可以肆无忌惮的打印中文啦~~由于调试,金额可以随便指定,只是个样子而已啦!
    这里写图片描述
    若要源码,以及对照表,则从此处下载,发布在我的资源中
    链接:http://download.csdn.net/download/skyblue535/9991713

    展开全文
  • 嵌入式开发UTF8转GB2312

    2020-12-04 13:31:42
    UTF8转中文GB2312,解决嵌入式开发中文显示乱码问题 转换代码如下: #define u8 unsigned char #define u16 unsigned short int #define u32 unsigned int int GetUtf8ByteNumForWord(u8 firstCh) { u8 temp = 0x80;...

    UTF8转中文GB2312,解决嵌入式开发中文显示乱码问题

    转换代码如下:

    #define u8 unsigned char
    #define u16 unsigned short int
    #define u32 unsigned int
    
    int GetUtf8ByteNumForWord(u8 firstCh)
    {
    	u8 temp = 0x80;
    	int num = 0;
    	while (temp & firstCh)
    	{
    		num++;
    		temp = (temp >> 1);
    	}
    	return num;
    }
    
    u16 SearchCodeTable(u16 unicodeKey, UNICODE_TO_GB *code_table, int CODE_TABLE_SIZE)
    {
    	int first = 0;
    	int end = CODE_TABLE_SIZE - 1;
    	int mid = 0;
    	if (!code_table)		return 0;
    	if (!CODE_TABLE_SIZE)	return 0;
    	while (first <= end)
    	{
    		mid = (first + end) / 2;
    		if (code_table[mid].unicode == unicodeKey)
    		{
    			return code_table[mid].gb;
    		}
    		else if (code_table[mid].unicode > unicodeKey)
    		{
    			end = mid - 1;
    		}
    		else
    		{
    			first = mid + 1;
    		}
    	}
    	return 0;
    }
    
    int Utf8ToGb2312(const char* utf8, int len, char *temp)
    {
    	int byteCount = 0;
    	int i = 0;
    	int j = 0;
    	u16 unicodeKey = 0;
    	u16 gbKey = 0;
    	while (i < len)
    	{
    		switch (GetUtf8ByteNumForWord((u8)utf8[i]))
    		{
    		case 0:
    			temp[j] = utf8[i];
    			byteCount = 1;
    			break;
    		case 2:
    			temp[j] = utf8[i];
    			temp[j + 1] = utf8[i + 1];
    			byteCount = 2;
    			break;
    		case 3:
    			temp[j + 1] = ((utf8[i] & 0x0F) << 4) | ((utf8[i + 1] >> 2) & 0x0F);
    			temp[j] = ((utf8[i + 1] & 0x03) << 6) + (utf8[i + 2] & 0x3F);
    			memcpy(&unicodeKey, (temp + j), 2);
    			gbKey = SearchCodeTable(unicodeKey, a_CodeConvertTab_ucs2gb, CODE_CONVERT_MAXLENGTH_GBK);
    			if (gbKey != 0)
    			{
    				gbKey = (gbKey >> 8) | (gbKey << 8);
    				memcpy((temp + j), &gbKey, 2);
    			}
    			byteCount = 3;
    			break;
    		case 4:
    			byteCount = 4;
    			break;
    		case 5:
    			byteCount = 5;
    			break;
    		case 6:
    			byteCount = 6;
    			break;
    		default:
    			//break;
    			return -1;
    		}
    		i += byteCount;
    		if (byteCount == 1)
    		{
    			j++;
    		}
    		else
    		{
    			j += 2;
    		}
    	}
    	return 0;
    }
    

    测试结果:

    如智能硬件定位,转换后串口返回如下:

    {"infocode":"10000","result":{"city":"西安市","province":"陕西省","poi":"汇诚国际","adcode":"610113","street":"枫林路","desc":"陕西省 西安市 雁塔区 枫林路","country":"中国","type":"4","location":"108.8919735,34.2310978","road":"枫林路","radius":"550","citycode":"029"},"info":"OK","status":"1"}
    
    展开全文
  • utf-8编码的中文注释 在 sourceinsight 显示乱码的解决方法---utf8 转gb2312插件

    utf-8编码的中文注释 在 sourceinsight 显示乱码的解决方法---utf8 转gb2312插件

    参考文章:

    (1)utf-8编码的中文注释 在 sourceinsight 显示乱码的解决方法---utf8 转gb2312插件

    (2)https://www.cnblogs.com/diving/archive/2012/11/07/2758171.html


    备忘一下。


    展开全文
  • UTF-8GB2312

    2013-08-20 11:16:08
    UTF-8GB2312,解决中文传参时的乱码问题
  • Perl中文/unicode/utf8/GB2312编码之间的转换是一件很让人头疼的事情,我总结了以下主要的转换方法,供大家了解参考。 # author: jiangyujie use utf8; use Encode; use URI::Escape; $\ = "\n"; ...
    Perl中文/unicode/utf8/GB2312编码之间的转换是一件很让人头疼的事情,我总结了以下主要的转换方法,供大家了解参考。
    
    # author: jiangyujie  
    use utf8;  
    use Encode;  
    use URI::Escape;  
      
    $\ = "\n";  
      
    #从unicode得到utf8编码  
    $str = '%u6536';  
    $str =~ s/\%u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;  
    $str = encode( "utf8", $str );  
    print uc unpack( "H*", $str );  
      
    # 从unicode得到gb2312编码  
    $str = '%u6536';  
    $str =~ s/\%u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;  
    $str = encode( "gb2312", $str );  
    print uc unpack( "H*", $str );  
      
    # 从中文得到utf8编码  
    $str = "";  
    print uri_escape($str);  
      
    # 从utf8编码得到中文  
    $utf8_str = uri_escape("");  
    print uri_unescape($str);  
      
    # 从中文得到perl unicode  
    utf8::decode($str);  
    @chars = split //, $str;  
    foreach (@chars) {  
        printf "%x ", ord($_);  
    }  
      
    # 从中文得到标准unicode  
    $a = "汉语";  
    $a = decode( "utf8", $a );  
    map { print "\\u", sprintf( "%x", $_ ) } unpack( "U*", $a );  
      
    # 从标准unicode得到中文  
    $str = '%u6536';  
    $str =~ s/\%u([0-9a-fA-F]{4})/pack("U",hex($1))/eg;  
    $str = encode( "utf8", $str );  
    print $str;  
      
    # 从perl unicode得到中文  
    my $unicode = "\x{505c}\x{8f66}";  
    print encode( "utf8", $unicode );  

    转载于:https://www.cnblogs.com/deacon/articles/2608108.html

    展开全文
  • utf-8 gb2312 转码

    2015-02-02 16:36:37
    utf-8 gb2312 转码 支持中文汉字 可以直接输入 转码
  • Java中将数据由UTF8转换成GB2312格式UTF8转换成GB2312 当我们在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时,JVM会把输送的数据编码成UTF8格式。如果我们直接从HTTP流中提取中文...
  • android utf-8 转gb2312

    千次阅读 2013-12-14 21:14:38
    android 通过EditText.getText().toString(),得到设备的名称(devicename),android默认的编码是utf-8,现在修改支持中文的名字,必须要对devicename字符串gbk或者gb2312,开始觉得字符串转码,本来就有接口:...
  • 一、背景 因项目需求,要导出Excel表格数据,使用fputcsv方法导出数据遇到中文乱码,去网上查找了一遍解决方法。 ...1)设置header编码修改为UTF-8 ...由于项目默认是UTF-8编码,Excel不支持,所以得把UTF-8转
  • XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)(附带解决DHTMLX不能用中文的问题)在数据发送一方,利用 javascript 的 escape 函数事先将所有中文转换成英文编码并保存(也可以用 ASP 等其它语言的函数实时转换输出)...
  • 中文在URL里的编码规则:gb2312编码 一个汉字对应2个字节 "中国人" utf-8编码 一个汉字对应3个字节 "中国人" 编码 C#中的表示形式 结果 gb2312 System...
  • C++ UTF-8GB2312的转换

    2019-11-12 10:28:11
    最近在编写QT程序时发现字符串传递到函数中中文乱码,需要将utf-8gb2312进行相互转换。 //UTF-8GB2312的转换 static char* G2U(const char* gb2312) { int len = MultiByteToWideChar(CP_ACP, 0, gb2312, ...
  • Linux下/Qt UTF-8转GB2312

    千次阅读 2017-11-14 09:29:26
    1.背景 项目需要用到热敏打印机,控制接口为串口(RS232),运行环境为Linux+Qt。在此之前,在MCU平台的...现有的配置情况是,热敏打印机提供的英文、数字字库是ASII格式,中文字库是GB2312格式,平台控制端采用U...
  • 这个转换需要以下7个文件,big5-gb.tabbig5-unicode.tabgb-big5.tabgb-unicode.tabunicode-big5.tabunicode-gb.tablanguage.inc.php编写 PHP 代码的过程中,经常会遇到需要对中文转码的问题,如 GB2312 <...
  • //先utf8 gb2312 char* gb2312=UTF8_To_GB2312(utf8); //gb2312转unicode WCHAR* w=MByteToWChar(gb2312); delete gb2312; len=wcslen(w)*2; return (char*)w; } std::wstring UTF8_To_Unicode( ...
  • 一、如果你想把utf-8转为GB2312 1、用记事本打开源码,把换成;如果是JS不需要加这句,如果是网页最好加上这句和你页面对应的编码。 2、用记事本打开源码,另存为,编码 哪里选择 ANSI 即可。 二、如果你想把GB2312...
  • gb2312utf8相互转换

    2018-11-07 17:26:41
    基于keil,单片机,实现gb2312utf8编码的相互转换,实现web中文下发后台的封装转换。
  • 在使用webView时,如果url中参数有中文的话,拦截到的字符串就会类似这样的:http://api.letstar.cn/zq/news.html?id=20&cupName=%E6%B5%8B%E8%AF%957,那我如果想使用cupName怎么办呢? public static ...
  • 选择文件夹,将指定文件里面的所有特定后缀的UTF-8编码文件GB2312文件,使用VS2013 ,MFC 开发.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,683
精华内容 673
关键字:

中文utf8转gb2312