OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5651|回复: 9

关于 使用Unicode字库在LCD屏幕上显示 葡萄牙文的问题

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
发表于 2022-10-13 09:35:41 | 显示全部楼层 |阅读模式
用字库生成器生成了  葡萄牙文的  Unicode  字库      我该怎么样才能将   想要显示的  葡萄牙文  转化为Unicode编码(用的是  Keil )

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
 楼主| 发表于 2022-10-13 16:19:31 | 显示全部楼层
目前的解决方法为 :
   1、将 KEIL  设置为  UTF  编码
   2、封装了一个UTF转Unicode编码的函数
   3、所得到的 数组即为想要的编码
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
 楼主| 发表于 2022-10-13 09:42:08 | 显示全部楼层
还有问题就是   如果将葡萄牙文  放到数组里面    他会以啥编码格式  进行存储呢
    wchar_t str[] = L"Olá";
回复 支持 反对

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-10-13 09:51:30 | 显示全部楼层
把值用串口以十六进制直接打出来看看呗!
日常敲键--头秃一片
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
 楼主| 发表于 2022-10-13 09:58:18 | 显示全部楼层
日渐秃兀 发表于 2022-10-13 09:51
把值用串口以十六进制直接打出来看看呗!

您好   我仿真试了试  
  Olá      在数组中   是    0x004F  0x006C  0x8c29

但是 在Unicode编码中
   Olá      对应的是         0x004F  0x006C  0x00E1
应该怎样弄才能实现将   Olá   转化成Unicode编码   的  格式呢
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
 楼主| 发表于 2022-10-13 09:59:18 | 显示全部楼层
日渐秃兀 发表于 2022-10-13 09:51
把值用串口以十六进制直接打出来看看呗!

我程序代码  是  
  1. int main(void)
  2. {
  3.   setlocale(LC_ALL, "pt-PT.unicode");
  4.         wchar_t str[] = L"Olá";

  5.         SystemInit();
  6.         delay_init(48);

  7.   char* buf = (char*)malloc(MB_CUR_MAX);
  8. //  for (i = 0; i < MyWcslen(str); i++)
  9. //      wprintf(L"%lx", str[i]);
  10.   p = (short*)str;
  11.         while (1)
  12.         {
  13.         }
  14. }
复制代码
回复 支持 反对

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-10-13 10:03:19 | 显示全部楼层
李哈哈 发表于 2022-10-13 09:58
您好   我仿真试了试  
  Olá      在数组中   是    0x004F  0x006C  0x8c29

unicode编码转换公式 你试一下百度看看,我也没用过这种格式存储他可以借鉴一下别人的unicode编码和字符串的转换算法
日常敲键--头秃一片
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2021-1-9
在线时间
45 小时
 楼主| 发表于 2022-10-13 10:08:28 | 显示全部楼层
日渐秃兀 发表于 2022-10-13 10:03
unicode编码转换公式 你试一下百度看看,我也没用过这种格式存储他可以借鉴一下别人的unicode编码和字符 ...

好的好的  谢谢
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2023-3-21
在线时间
2 小时
发表于 2023-5-29 11:38:30 | 显示全部楼层
请问如何将unicode(UTF8编码)与点阵字库联系起来,目前需要将多国语言做成一个点阵字库,用unicode来索引字库并显示在LCD上面,应该如何实现呢?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2023-3-21
在线时间
2 小时
发表于 2023-5-31 16:44:59 | 显示全部楼层
fangentle 发表于 2023-5-29 11:38
请问如何将unicode(UTF8编码)与点阵字库联系起来,目前需要将多国语言做成一个点阵字库,用unicode来索引字 ...

uitf8转换unicode函数如下:
int enc_get_utf8_size(const uint8_t pInput)
{
   uint8_t c = pInput;
   int ret;
   // 0xxxxxxx 返回0
   // 10xxxxxx 不存在
   // 110xxxxx 返回2
   // 1110xxxx 返回3
   // 11110xxx 返回4
   // 111110xx 返回5
    // 1111110x 返回6
    if(c< 0x80) ret = 0;
    if(c>=0x80 && c<0xC0) ret = -1;
    if(c>=0xC0 && c<0xE0) ret = 2;
    if(c>=0xE0 && c<0xF0) ret = 3;
    if(c>=0xF0 && c<0xF8) ret = 4;
    if(c>=0xF8 && c<0xFC) ret = 5;
    if(c>=0xFC) ret = 6;
    return ret;
}

/*****************************************************************************
* 将一个字符的UTF8编码转换成Unicode(UCS-2和UCS-4)编码.
*
* 参数:
*    pInput      指向输入缓冲区, 以UTF-8编码
*    Unic        指向输出缓冲区, 其保存的数据即是Unicode编码值,
*                类型为unsigned long .
*
* 返回值:
*    成功则返回该字符的UTF8编码所占用的字节数; 失败则返回0.
*
* 注意:
*     1. UTF8没有字节序问题, 但是Unicode有字节序要求;
*        字节序分为大端(Big Endian)和小端(Little Endian)两种;
*        在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位)
****************************************************************************/
uint8_t utf8_to_unicode(const uint8_t* pInput, uint32_t* Unic)
{
    // b1 表示UTF-8编码的pInput中的高字节, b2 表示次高字节, ...
    char b1, b2, b3, b4, b5, b6;
  
    *Unic = 0x0; // 把 *Unic 初始化为全零
    int utfbytes = enc_get_utf8_size(*pInput);
    uint8_t *pOutput = (uint8_t *) Unic;

    switch ( utfbytes )
    {
        case 0:
            *pOutput     = *pInput;
            utfbytes    += 1;
            break;
        case 2:
            b1 = *pInput;
            b2 = *(pInput + 1);
            if ( (b2 & 0xC0) != 0x80 )
                return 0;
            *pOutput     = (b1 << 6) + (b2 & 0x3F);
            *(pOutput+1) = (b1 >> 2) & 0x07;
            break;
        case 3:
            b1 = *pInput;
            b2 = *(pInput + 1);
            b3 = *(pInput + 2);
            if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) )
                return 0;
            *pOutput     = (b2 << 6) + (b3 & 0x3F);
            *(pOutput+1) = (b1 << 4) + ((b2 >> 2) & 0x0F);
            break;
        case 4:
            b1 = *pInput;
            b2 = *(pInput + 1);
            b3 = *(pInput + 2);
            b4 = *(pInput + 3);
            if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
                    || ((b4 & 0xC0) != 0x80) )
                return 0;
            *pOutput     = (b3 << 6) + (b4 & 0x3F);
            *(pOutput+1) = (b2 << 4) + ((b3 >> 2) & 0x0F);
            *(pOutput+2) = ((b1 << 2) & 0x1C)  + ((b2 >> 4) & 0x03);
            break;
        case 5:
            b1 = *pInput;
            b2 = *(pInput + 1);
            b3 = *(pInput + 2);
            b4 = *(pInput + 3);
            b5 = *(pInput + 4);
            if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
                    || ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80) )
                return 0;
            *pOutput     = (b4 << 6) + (b5 & 0x3F);
            *(pOutput+1) = (b3 << 4) + ((b4 >> 2) & 0x0F);
            *(pOutput+2) = (b2 << 2) + ((b3 >> 4) & 0x03);
            *(pOutput+3) = (b1 << 6);
            break;
        case 6:
            b1 = *pInput;
            b2 = *(pInput + 1);
            b3 = *(pInput + 2);
            b4 = *(pInput + 3);
            b5 = *(pInput + 4);
            b6 = *(pInput + 5);
            if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80)
                    || ((b4 & 0xC0) != 0x80) || ((b5 & 0xC0) != 0x80)
                    || ((b6 & 0xC0) != 0x80) )
                return 0;
            *pOutput     = (b5 << 6) + (b6 & 0x3F);
            *(pOutput+1) = (b5 << 4) + ((b6 >> 2) & 0x0F);
            *(pOutput+2) = (b3 << 2) + ((b4 >> 4) & 0x03);
            *(pOutput+3) = ((b1 << 6) & 0x40) + (b2 & 0x3F);
            break;
        default:
            return 0;
    }
  
    return (uint8_t)utfbytes;
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 06:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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