ハスマルチメディア(MPP)の開発(6) - 地域管理(REGION&OSD中国の表示)

(A)は、文字エンコーディングを記述します

1.1 ASCIIコード

    我々は、各バイナリ桁(ビット)は、2つの状態0および1を有している。コンピュータの内部に、すべての情報が最終的にバイナリ文字列として表現されていることを知っているので、8ビットであり、256個の状態のうち組み合わせることができますバイト(バイト)と呼ばれる。換言すれば、バイトは0000000 11111111から、256個のシンボルであるシンボル、256の異なる状態、各状態相当の合計を表すために使用することができ
    、1960米国では、英語の文字とビットの間の関係を文字エンコーディングのセットを開発した均一な規制をした。これはASCIIコードと呼ばれ、以来使用されている。
ASCIIエンコードするコードは、このようなスペース「スペースとして、128文字の合計を提供します「32(00100000二進)、大文字のAが65(バイナリ01000001)である。これは、それは、まず1バイトの後ろ7をとり、(プリントアウトすることができない32個の制御シンボルを含む)128個のシンボルでありますビット0は、均一な規制です。

1.2非ASCIIエンコーディング

    128シンボルが十分にエンコードするが、他の言語を表すためと英語は、128シンボルでは十分ではありません。たとえば、フランス語では、それはASCIIで表現できない、発音記号、文字の上にあります。そのため、一部の欧州諸国新しいシンボルに組み込まれたアイドルの最上位バイトを使用することを決断した。例えば、130として符号化されたフランスのE(10000010二進)。欧州諸国で使用される結果として、コーディングシステム、256個のシンボルまでを表すことができます。
    しかし、ここで再び、新たな問題がある。さまざまな国が、彼らは手紙によって表される、エンコード256個の記号を使用している場合でも、そのため、異なる文字を持っていることは同じではありません。例えば、130で、コーディングフランス語でéを表しそれは別のに代わってロシアの符号化シンボル意志でコーディングヘブライ文字ギメルを(ג)、を表します。

注:
    。しかし、いずれにしても、すべてのこれらのコード、シンボルは、0〜127を表し、この期間でのみ128-255 // MMMMMと同じではない、同じで
、さらに使用されるテキストのアジア諸国、シンボルについて多くの億10として漢字として。バイトはシンボルのみの256種類を表すことができ、確かに十分ではありません、あなたはシンボルを表現する複数のバイトを使用する必要があります。たとえば、簡体字中国語、共通のエンコーディングはGB2312で、使用の2つのバイトこれは、文字を表し、その理論的には256×256 = 65536シンボルまで表現することができます。

このブログhttps://blog.csdn.net/tge7618291/article/details/7599902 tge7618291のから上記参照。

(II)のトランスコーディング

    簡体字中国語を簡素化する文字が表示されるまで、あなたはUTF-8形式にその後、Unicode形式、Unicode形式にGBK形式を変換し、最終的にそれが表示されるまでに取得する必要があり、GBK2312形式です。
GBKのターンは、Unicodeに変換されます。

unsigned short zz_gbk2uni(unsigned char ch, unsigned char cl)
{
    ch -= 0x81;
    cl -= 0x40;
    return (ch<=0x7d && cl<=0xbe) ? mb_gb2uni_table[ch*0xbf+cl] : 0x1fff;
}

Unicodeは、UTF-8を回します:

/***************************************************************************** 
 * 将一个字符的Unicode(UCS-2和UCS-4)编码转换成UTF-8编码. 
 * 
 * 参数: 
 *    unic     字符的Unicode编码值 
 *    pOutput  指向输出的用于存储UTF8编码值的缓冲区的指针 
 *    outsize  pOutput缓冲的大小 
 * 
 * 返回值: 
 *    返回转换后的字符的UTF8编码所占的字节数, 如果出错则返回 0 . 
 * 
 * 注意: 
 *     1. UTF8没有字节序问题, 但是Unicode有字节序要求; 
 *        字节序分为大端(Big Endian)和小端(Little Endian)两种; 
 *        在Intel处理器中采用小端法表示, 在此采用小端法表示. (低地址存低位) 
 *     2. 请保证 pOutput 缓冲区有最少有 6 字节的空间大小! 
 ****************************************************************************/  
int enc_unicode_to_utf8_one(unsigned long unic, unsigned char *pOutput,  
        int outSize)  
{  
    if(pOutput == NULL)
        return 0;  

    if(outSize < 6)
      return 0;  

    if ( unic <= 0x0000007F )  
    {  
        // * U-00000000 - U-0000007F:  0xxxxxxx  
        *pOutput     = (unic & 0x7F);  
        return 1;  
    }  
    else if ( unic >= 0x00000080 && unic <= 0x000007FF )  
    {  
        // * U-00000080 - U-000007FF:  110xxxxx 10xxxxxx  
        *(pOutput+1) = (unic & 0x3F) | 0x80;  
        *pOutput     = ((unic >> 6) & 0x1F) | 0xC0;  
        return 2;  
    }  
    else if ( unic >= 0x00000800 && unic <= 0x0000FFFF )  
    {  
        // * U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx  
        *(pOutput+2) = (unic & 0x3F) | 0x80;  
        *(pOutput+1) = ((unic >>  6) & 0x3F) | 0x80;  
        *pOutput     = ((unic >> 12) & 0x0F) | 0xE0;  
        return 3;  
    }  
    else if ( unic >= 0x00010000 && unic <= 0x001FFFFF )  
    {  
        // * U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
        *(pOutput+3) = (unic & 0x3F) | 0x80;  
        *(pOutput+2) = ((unic >>  6) & 0x3F) | 0x80;  
        *(pOutput+1) = ((unic >> 12) & 0x3F) | 0x80;  
        *pOutput     = ((unic >> 18) & 0x07) | 0xF0;  
        return 4;  
    }  
    else if ( unic >= 0x00200000 && unic <= 0x03FFFFFF )  
    {  
        // * U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
        *(pOutput+4) = (unic & 0x3F) | 0x80;  
        *(pOutput+3) = ((unic >>  6) & 0x3F) | 0x80;  
        *(pOutput+2) = ((unic >> 12) & 0x3F) | 0x80;  
        *(pOutput+1) = ((unic >> 18) & 0x3F) | 0x80;  
        *pOutput     = ((unic >> 24) & 0x03) | 0xF8;  
        return 5;  
    }  
    else if ( unic >= 0x04000000 && unic <= 0x7FFFFFFF )  
    {  
        // * U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
        *(pOutput+5) = (unic & 0x3F) | 0x80;  
        *(pOutput+4) = ((unic >>  6) & 0x3F) | 0x80;  
        *(pOutput+3) = ((unic >> 12) & 0x3F) | 0x80;  
        *(pOutput+2) = ((unic >> 18) & 0x3F) | 0x80;  
        *(pOutput+1) = ((unic >> 24) & 0x3F) | 0x80;  
        *pOutput     = ((unic >> 30) & 0x01) | 0xFC;  
        return 6;  
    }  
  
    return 0;  
}  

(C)画像生成中国語

    コンテンツおよび類似の導入ではなく、中国では、通常のショーすることができ、ワープロに2バイト、2つのバイトを占めています。

/************************************************************
*Copyright (C),lcb0281at163.com lcb0281atgmail.com
*BlogAddr: caibiao-lee.blog.csdn.net
*FileName: debug_font_osd.c
*Description:字符和文字生成图片
*Date:     2020-02-03
*Author:   Caibiao Lee
*Version:  V1.0
*Others:
*History:
***********************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"
#include "debug_font_osd.h"

#define CHINESET_STRING "阿标在学习中"

#define FONT_PATH       "./font/hisi_osd.ttf"

int string_to_bmp(char *pu8Str)
{
    SDL_PixelFormat *fmt;
    TTF_Font *font;  
    SDL_Surface *text, *temp;  

    if (TTF_Init() < 0 ) 
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  
        SDL_Quit();
    }  

    font = TTF_OpenFont(FONT_PATH, 80); 
    if ( font == NULL ) 
    {  
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n",18,"ptsize", SDL_GetError());  
    }  

    SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };  
    text = TTF_RenderUTF8_Solid(font, pu8Str, forecol);

    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;

    temp = SDL_ConvertSurface(text,fmt,0);
    SDL_SaveBMP(temp, "save.bmp"); 

    SDL_FreeSurface(text);  
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);  
    TTF_Quit();  

    return 0;
}

int CreateTimeBmpPicture(void)
{
    time_t     l_stTime;
    struct tm  l_stTm;
    struct tm *l_pstTm=&l_stTm;
    char s8Contenx[128]={0};

    time(&l_stTime);
    localtime_r(&l_stTime,l_pstTm); 
    snprintf(s8Contenx,sizeof(s8Contenx), "20%02d-%02d-%02d-%02d:%02d:%02d",\
        (l_pstTm->tm_year-100), (1+l_pstTm->tm_mon), l_pstTm->tm_mday,\
            l_pstTm->tm_hour, l_pstTm->tm_min, l_pstTm->tm_sec);

    printf("string: %s \n",s8Contenx);
    string_to_bmp(s8Contenx);        
}

int CreateChinesePicture(void)
{
    int  i = 0;
    char l_s32Len = 0;
    char l_arrs8Str[64] = {0};
    char l_arrs8UTFBuf[64] = {0};
    char l_arrss8Contenx[64] = {0};
    unsigned short usUnicode=0;
    
    unsigned int usUtfLen=0;
    unsigned int u32ContenxOffest=0; 
    
    snprintf(l_arrs8Str,sizeof(l_arrs8Str),"%s",CHINESET_STRING);
    
    l_s32Len = strlen(l_arrs8Str);

    printf(" len = %d \n",l_s32Len);

    for(i=0;i<l_s32Len;)
    {
        usUnicode=zz_gbk2uni((unsigned char)l_arrs8Str[i++],(unsigned char)l_arrs8Str[i++]);
        usUtfLen= enc_unicode_to_utf8_one(usUnicode,l_arrs8UTFBuf,64);
        if(usUtfLen<0)
        {
            printf("%s %d out len error \n",__FUNCTION__,__LINE__);
            break;
        };

        memcpy(&l_arrss8Contenx[u32ContenxOffest],l_arrs8UTFBuf,usUtfLen);
        
        u32ContenxOffest+=usUtfLen;
    }

    string_to_bmp(l_arrss8Contenx);

    return 0;

}

int main(void)
{
    printf("hello world \n");
    //CreateTimeBmpPicture();

    CreateChinesePicture();
    return 0;
}

プロジェクトファイル構造:

biao@ubuntu:~/nfs/OSD/font$ tree -L 2
.
├── bin
│   └── objs
├── debug_font_osd.c
├── debug_font_osd.h
├── font
│   ├── hisi_osd.ttf
│   └── hisi_osd.ttf_df
├── GBK_To_Unicode.c
├── GBK_To_Unicode.h
├── inc
│   ├── freetype2
│   ├── ft2build.h
│   └── SDL
├── lib
│   ├── libfreetype.a
│   ├── libfreetype.so
│   ├── libfreetype.so.6
│   ├── libSDL-1.2.so.0
│   ├── libSDL.a
│   ├── libSDLmain.a
│   ├── libSDL.so
│   ├── libSDL_ttf-2.0.so.0
│   ├── libSDL_ttf.a
│   ├── libSDL_ttf.so
│   └── pkgconfig
├── Makefile
├── save.bmp
└── test

8 directories, 20 files
biao@ubuntu:~/nfs/OSD/font$ 

得られた画像は以下のように表示されます。

あなたがビデオストリームに中国語の文字を追加する必要がある場合は、ブログの内容を参照することができます。

エンジニアリング時間画像の第1世代は、以下から得ることができます。

GitHubの:  freetype_SDL_Dl_ttf_debug 

CSDN:   freetype_SDL_Dl_ttf_debug.tar.gz

完全なプロジェクトは、地域に行くことができる「カタログ序文」のアドレス取得に提供します

 

このコラムの最初の記事「カタログ序文、」ディレクトリの順で読み取るリスト完全なディレクトリの欄には、あなたの理解を支援します。

 

 

 

 

 

 

 

公開された175元の記事 ウォンの賞賛262 ビュー700 000 +

おすすめ

転載: blog.csdn.net/li_wen01/article/details/105025120