• 嵌入式软件国际化(多语言) 点阵字库选择分析


    嵌入式软件国际化(多语言) 点阵字库选择分析

    多字节字符集与unicode

    • 多字节编码最大的问题在于每一个语种的字符集编码不兼容。
    • unicode的好处在于将所有人类语种字符都有了统一的编码。现在世界上语言基本都包含在了基本多文种平面0上(BMP0)即编号只占用2个字节。

    字符集选择相关问题分析

    方案1.不使用unicode 使用所谓的ANSI

    • 如果中文版本就是使用ANSI(中文标准即GB2312),那么对于继续支持英文、德文是没有问题的。而对于俄文、日文却支持的不够全面,毕竟这是中文的标准。
    • 每一种语言包资源文件的编码格式不相同。虽然都叫ANSI,但是每一种语言的标准是不同的。只有这样才能从字库中解析出正确的字符。
    • 多支持一个语种就需要多,烧写一种相互不兼容的字库(毕竟一个语种和另外一个语种的ANSI是不一样的),相应的字符解析部分代码也需要许多条件判断进行不同的算法分析,以显示出正确语种的字符。

    方案2.使用unicode

    • 首先语言包资源文件的格式都可以是一样的编码方式(UTF-8(BOM)、UTF-8、UCS-2 Big endian、UCS-2 Little endian)。
    • 只需要烧写同一中字库就OK了,一劳永逸,如果空间不够大,可以至少写里面的某些片段。
    • 对于同一种编码格式(以UTF-8为例),需要写两个转换算法,即UTF-8编码到Unicode编号和Unicode编号到UTF-8。
    • 如果使用UTF-8编码,由于其对于每一个字符编码所占用的空间是不定的(1字节-3字节),所以有可能导致源代码中的字符串空间越界,毕竟原来是固定每个汉字都是占用两个字节。
    • 如果使用UCS-2编码,那么每一个字符都将用2个字节表示,字符的编号和文档中存储的字符编码是相等的。那么对于编号比较小的字符字符ASCCI码,就会在编码高位中会出现0x00这样的数字,而0x00又是一个字符串的结束标志,所以如果使用UCS-2编码就需要通过代码来区分两种情况了。

    结论

    • 对于支持语言种类比较少的,有明确目标支持某些语言,可以选择第一种方案。比较平滑。
    • 对于国际化进程比较深入的,可以选择第二种方案,虽然前期比较困难,但是后期会很顺。

    相关代码共享:

    1.UTF-8到unicode的转换:

    以下为将UTF-8转为Unicode的C语言代码,
    这部分代码经过测试,能够正确执行,没有发现明显问题:

    /*
     *    Function Name : utf82unicode
     *    Create Date   : 2015/07/23-2015/07/24
     *    Author        : Houlw-Houlw
     *    Description   : 将一个UTF-8编码序列,转换为Unicode编号.
     *    Param         : utf8   -- 输入参数,表示UTF-8编码字符串.
     *                    pcount -- 输出参数,表示这个字符表示为UTF-8需要多少字节.
     *    Return Code   : Unicode 字符编号;如果大于0xFFFFFF00,表示处理出错.
     */
    INT32U  utf82unicode(INT8U *utf8,INT8U *pcount)
    {
        INT32U  unicode;
        INT8U   countbyte,i;
        
        unicode = 0xFFFFFFFF;
        countbyte = 0;
        /* Analysis of the first byte */
        i=0;
        if(utf8[0]<0x80)                             /*   0000 ~ 00 007F  0XXX XXXX            */
        {
            countbyte = 1;
            unicode = utf8[i];
        }else if((utf8[0]&0xE0) == 0xC0)             /*   0080 ~ 00 07FF  110X XXXX  10XX XXXX */
        {
            countbyte = 2;
            unicode = (utf8[i]&(~0xE0));
        }else if((utf8[0]&0xF0) == 0xE0)             /*   0800 ~ 00 FFFF  1110 XXXX  10XX ...  */
        {
            countbyte = 3;
            unicode = (utf8[i]&(~0xF0));
        }else if((utf8[0]&0xF8) == 0xF0)             /* 1 0000 ~ 1F FFFF  1111 0XXX  10XX ...  */
        {
            countbyte = 4;
            unicode = (utf8[i]&(~0xF8));
        }else if((utf8[0]&0xFC) == 0xF8)             /* 2 0000 ~ 3F FFFF  1111 10XX  10XX ...  */
        {
            countbyte = 5;
            unicode = (utf8[i]&(~0xFC));
        }else if((utf8[0]&0xFE) == 0xFC)             /* 4 0000 ~ 7F FFFF  1111 110X  10XX ...  */
        {
            countbyte = 6;
            unicode = (utf8[i]&(~0xFE));
        }
        
        if(pcount != NULL)
        {
            *pcount = countbyte;
        }
       
        /* Analysis of remaining bytes */
        for(i++;i<countbyte;i++)
        {
            if((utf8[i]&0xC0) == 0x80)
            {
                unicode <<= 6;
                unicode |= (utf8[i]&(~0xC0));
            }else{                                   /* Error Code  */
                unicode = 0xFFFFFF00|(countbyte<<4)|i;
                break;
            }
        }
        return unicode;
    }
    

    作者:

    • Q Q :1144794789
    • 邮箱 :LeviHou@qq.com
    • 博客 :LeviHou
    • 微博 :LeviHou
  • 相关阅读:
    内存优化
    OpenThreads库学习
    WPS/office使用技巧系列
    NB-IOT学习
    JSON和XML
    物联网平台学习
    .net提供的5种request-response方法一
    HTML5之IndexedDB使用详解
    jQuery圆形统计图实战开发
    用javascript将数据导入Excel
  • 原文地址:https://www.cnblogs.com/LeviHou/p/4669724.html
Copyright © 2020-2023  润新知