硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10677|回复: 5
收起左侧

[emWin] Unicode编码

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
发表于 2013-9-13 21:15:16 | 显示全部楼层 |阅读模式
Unicode
       Unicode标准是一种16位字符编码方案。全世界所有可用字符都包含在一个16位的字符集中 (全
球统一)。Unicode标准由统一码联盟(Unicode Consortium)定义。emWin能显示采用Unicode编码
的单个字符或字符串,不过,最常见的情况是使用混合字符串,即一个ASCII字符串中有任意个Unicode
序列。


UTF-8编码方案

       ISO/IEC 10646-1定义了一种称为通用字符集(UCS)的多八位字符集,收入了全球大多数文字系统。
然而,多八位字符并不兼容许多现有的应用程序和协议,因此就扩展出了一些各有特色的UCS转换格式
(UTF)。UTF-8具有多种特点,保留了全部ASCII字符,并且兼容依赖于ASCII值但对其他值透明的文件系
统、解析器和其他软件。
       在emWin中,UTF-8字符以1至3个八位字节序列编码。如果将高序位设为0,则剩下的7位将用来
编码字符值。在一个由n个八位字节构成的序列中(n>1),起始八位字节第n个高序位设为1,其后一位
设为0。该八位字节的剩余位用于存放待编码字符的值位。后续八位字节都将高序位设为1,其后一位
设为0,各剩6位,用于保存待编码字符的值位。
下表显示了编码范围:
2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
 楼主| 发表于 2013-9-13 21:19:13 | 显示全部楼层
这个转自网络,说的非常不错。
http://www.amobbs.com/forum.php? ... p;highlight=unicode
总结起来,可以这样理解UTF-8/16/32,UTF-16是最初的Unicode编码形式,其原理类似DBCS,
但是显然2个字节并不能够将全世界语言完全编码;于是乎,UTF-32出现了,4字节的编码肯定
是足够了,但是用着用着发现,有很多字符的编码其高位都是0,太浪费空间;于是乎UTF-8和
UTF-16变异体出现了,其原理类似于MBCS,即使用变长字节对字符进行编码。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
 楼主| 发表于 2013-10-4 11:38:12 | 显示全部楼层
顶一下
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2013-10-6 14:19:09 | 显示全部楼层
顶起,支持硬汉
代码不规范,亲人两行泪!
回复

使用道具 举报

7

主题

33

回帖

17

积分

新手上路

积分
17
发表于 2013-12-17 08:54:34 | 显示全部楼层
这几天也碰到了一个unicode问题,不过幸运的是解决了,首先是fatfs unicode的使用问题,在ffconf.h中设置#define    _LFN_UNICODE    1
然后之后每次打开文件或者目录都要换一种形式比如res = f_open(&fontfsrc, _T("0:/sys/yahei24.xbf"), FA_OPEN_EXISTING | FA_READ);多了一个_T()宏,其实直接写L也可以,
然后如果路径是存成string的话要怎么办呢?当时我c语言基本功不好折腾了几个小时:
添加#include <wchar.h>
TCHAR _filepath[100];
char FilePath[96];
sprintf(FilePath,"%s","0:/user");
swprintf(_filepath,sizeof(_filepath),L"%s",filename);
这样_filepath的内容就变成L""0:/user" 啦,可以直接使用f_opendir(&DirInf,_filepath)打开路径啦


最后是读取文件名的问题,fatfs使用的是UTF16格式,但是有些需要用到UTF8(比如emwin)所以还写了一个转码函数
int unicode_to_utf8(uint16_t *in, char *tmp)
{
    int i = 0;
    int outsize = 0;
    int charscount = 0;
    uint8_t *result = NULL;
    for (i = 0; in [ i ] !=0x0000; i++)
    {
        uint16_t unicode = in [ i ];

        if (unicode >= 0x0000 && unicode <= 0x007f)
        {
            *tmp = (uint8_t)unicode;
            tmp++;
            outsize += 1;
        }
        else if (unicode >= 0x0080 && unicode <= 0x07ff)
        {
            *tmp = 0xc0 | (unicode >> 6);
            tmp += 1;
            *tmp = 0x80 | (unicode & (0xff >> 2));
            tmp += 1;
            outsize += 2;
        }
        else if (unicode >= 0x0800 && unicode <= 0xffff)
        {
            *tmp = 0xe0 | (unicode >> 12);
            tmp += 1;
            *tmp = 0x80 | (unicode >> 6 & 0x00ff);
            tmp += 1;
            *tmp = 0x80 | (unicode & (0xff >> 2));
            tmp += 1;
            outsize += 3;
        }

    }

    *tmp = '\\0';
//    *out = result;
    return 0;
}
写的太乱大家见谅哈
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107442
QQ
 楼主| 发表于 2014-3-14 17:08:42 | 显示全部楼层

回 jimmjimm 的帖子

jimmjimm:这几天也碰到了一个unicode问题,不过幸运的是解决了,首先是fatfs unicode的使用问题,在ffconf.h中设置#define    _LFN_UNICODE    1
然后之后每次打开文件或者目录都要换一种形式比如res = f_open(&fontfsrc, _T("0:/sys/yahei2 .. (2013-12-17 08:54) 
挺有价值的,刚看到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 07:07 , Processed in 0.169219 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表