gpt4 book ai didi

c - 如何向嵌入式项目添加 UTF-8 支持和关联的字体表?

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:31 27 4
gpt4 key购买 nike

我目前正在为嵌入式显示器设计字体引擎。基本问题如下:

我需要获取一个动态生成的文本字符串,在 UTF-8 表中查找该字符串的值,然后使用该表指向所有受支持字符的压缩位图数组。完成后,我调用一个位复制例程,将数据从位图数组移动到显示器。

我不会支持完整的 UTF-8 字符集,因为我可以使用的系统资源非常有限(32K ROM,8K RAM),但希望能够在以后添加所需的字形以进行本地化.所有开发都在 C 语言和汇编语言中完成。

字形大小最大为 16 位宽 x 16 位高。我们可能需要支持整个基本多语言平面(3 字节),因为我们的一些大客户在亚洲。但是,我们不会在任何特定本地化中包含整个表格。

我的问题是:
添加此 UTF-8 支持和关联表的最佳方法是什么?

最佳答案

下面的解决方案假定 Unicode 空间的低 16 位对您来说足够了。如果你的位图表有,比如 U+0020 到 U+007E 在位置 0x00 到 0x5E 和 U+00A0 到 U+00FF 在位置 0x5F 到 0xBE 和 U+1200 到 U+1241 在 0xBF 到 0xFF,你可以做类似的事情下面的代码(未经测试,甚至未经编译测试)。

位图图包含一系列值对。第一对中的第一个值是索引 0 处的位图表示的 Unicode 代码点。假设位图表包含一系列直接相邻的 Unicode 代码点。所以第二个值表示这个系列有多长。

while 循环的第一部分遍历 UTF-8 输入并在 ucs2char 中建立一个 Unicode 代码点。一旦找到一个完整的字符,第二部分就会在 bitmapmap 中提到的范围之一中搜索该字符。如果找到合适的位图索引,它会将其添加到索引中。没有位图的字符会被静默丢弃。

该函数返回找到的位图索引数。

就 unicode-> 位图表而言,这种处理方式应该是内存高效的,相当快速且相当灵活。

// Code below assumes C99, but is about three cut-and-pastes from C89
// Assuming an unsigned short is 16-bit

unsigned short bitmapmap[]={0x0020, 0x005E,
0x00A0, 0x0060,
0x1200, 0x0041,
0x0000};

int utf8_to_bitmap_indexes(unsigned char *utf8, unsigned short *indexes)
{
int bitmapsfound=0;
int utf8numchars;
unsigned char c;
unsigned short ucs2char;
while (*utf8)
{
c=*utf8;
if (c>=0xc0)
{
utf8numchars=0;
while (c&0x80)
{
utf8numchars++;
c<<=1;
}
c>>=utf8numchars;
ucs2char=0;
}
else if (utf8numchars && c<0x80)
{
// This is invalid UTF-8. Do our best.
utf8numchars=0;
}

if (utf8numchars)
{
c&=0x3f;
ucs2char<<=6;
ucs2char+=c;
utf8numchars--;
if (utf8numchars)
continue; // Our work here is done - no char yet
}
else
ucs2char=c;

// At this point, we have a complete UCS-2 char in ucs2char

unsigned short bmpsearch=0;
unsigned short bmpix=0;
while (bitmapmap[bmpsearch])
{
if (ucs2char>=bitmapmap[bmpsearch] && ucs2char<=bitmapmap[bmpsearch]+bitmapmap[bmpsearch+1])
{
*indexes++ = bmpix+(ucs2char-bitmapmap[bmpsearch]);
bitmapsfound++;
break;
}

bmpix+=bitmapmap[bmpsearch+1];
bmpsearch+=2;
}
}
return bitmapsfound;
}

编辑:您提到您需要的不仅仅是低 16 位。 s/unsigned short/unsigned int/;s/ucs2char/codepoint/;在上面的代码中,然后它可以处理整个 Unicode 空间。

关于c - 如何向嵌入式项目添加 UTF-8 支持和关联的字体表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/663207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com