问题描述
今天,我了解了由多个UTF8代码点组成的“字符”。我一直认为UTF8中的一个代码点映射到一个特定字符,但似乎我错了。 例如,以下单个字形“é”由3个字节组成,构成2个代码点。
我无法使用SDL_ttf正确渲染此符号。似乎使用了FT_Get_Char_Index 中的freetype library函数来找到字形。它通过传递代码点来实现,并且库将其视为一个以上字形来对待。我将如何使用freetype库正确渲染此字形?
TTF_Font *ttf = TTF_OpenFont("C:\\UbuntuMono-Regular.ttf",24);
SDL_Color color = {0,255,255};
SDL_Surface *surface = TTF_RenderUTF8_Blended(ttf,"é",color); // u8"é" doesn't work neither
解决方法
我无法重现您的问题。您的字体可能有问题吗?
这是我做的一个最小示例(只需将fontFile
更改为字体的路径):
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
int main()
{
const SDL_Color white = { 0xFF,0xFF,0 };
SDL_Window* window;
SDL_Renderer* renderer;
SDL_CreateWindowAndRenderer(200,200,&window,&renderer);
TTF_Init();
const char* fontFile = "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf";
TTF_Font *font = TTF_OpenFont(fontFile,32);
SDL_Surface* surface = TTF_RenderUTF8_Blended(font,"é",white);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer,surface);
SDL_Rect rect = {10,10,surface->w,surface->h};
while(1)
{
SDL_Event event;
SDL_WaitEvent(&event);
if(event.type == SDL_QUIT)
break;
SDL_SetRenderDrawColor(renderer,0);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer,texture,&rect);
SDL_RenderPresent(renderer);
}
}
这是我得到的输出:
我正在使用C。
我一直认为UTF8中的一个代码点映射到特定的 角色,但似乎我错了。例如,以下 单个字形“é”由3个字节组成,构成2个代码点。
是的,可以将几个代码点分组以组成一个“字符”(正确的名称是字素)(link)。但我认为é
(link)并非如此。尽管我可能对此有误。