簡體   English   中英

具有Unicode的FreeType [錯誤]

[英]FreeType with unicode [ERROR]

我將FreeType初始化如下:

if (FT_Init_FreeType(&ft)) {
        printf("couldn't init freetype\n");
        exit(1);
    }
    std::string fontPath = "D:/fonts/newscycle-bold.ttf";
    if (FT_New_Face(ft, fontPath.c_str(), 0, &face)) {
        printf("couldn't open font\n");
        exit(1);
    }

    FT_Select_Charmap(face, ft_encoding_unicode);
    FT_Set_Pixel_Sizes(face, 0, size);
    g = face->glyph; // declaration like FT_GlyphSlot g;

我得到如下字形:

    // load the w_char into the face object
if (FT_Load_Char(face, c, FT_LOAD_RENDER))
    printf("freetype is unable to load char: %c\n", c); // this runs if error was occured

我使用wchar_t*wchar_t類型。

但我看到以下內容: 在此處輸入圖片說明

我在使用Unicode字符時遇到了同樣的問題,最后我發現問題是從UTF8字符串到UTF16(wstring)的轉換。 我正在使用mbstowcs函數進行轉換,但是像“€”這樣的符號未按預期轉換。 對我而言,它的正常工作方式是使用新的C ++ 11 std::wstring_convert類。 嘗試這個:

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
const std::wstring wideText = convert.from_bytes(_text);

現在,將wideText字符串傳遞給FreeType。

可能為時已晚,但我遇到了同樣的問題。 原因是您使用了錯誤的功能來加載字符/字形。

您要做的就是將FT_Load_Char替換為FT_Load_Glyph

我猜想使用寬字符初始化字符串,您需要像這樣初始化它們:

wchar_t c = L'آ';
wchar_t w = _T('آ');
wchar_t *s = L"Hآ文";
wchar_t *q = _T("Hآ文");

但是,如果要在運行時加載字符串,則必須通過在某些文本編輯器中將字符串文件另存為utf-16或utf-32文件或通過轉換utf-8來將字符串轉換為ut16或utf-32帶功能的格式化字符串轉換為utf-16格式化字符串。

也可能是您的字體沒有嘗試顯示的字形

我在使用日語字符“あえいおう”時遇到了同樣的問題,並搜索了幾天-才發現我的字體只包含ASCII字符集和一些西方字符集,而沒有亞洲字符

如果字形不在字體內,它將被替換為...

  • ...一個空白方塊(請參見您的屏幕截圖),或...
  • ...一個帶有居中2線十六進制字形的正方形

示例: 圖片:渲染的“あえいおう” +1個錯誤字形

我在此示例使用的字體 包含日語字符集 ,但不包含泰語/越南語 字符 ,因此這就是為什么顯示日文字符而不顯示泰語/越南字符的原因 (盡管我不知道為什么有時它是一個帶有字形ID的正方形,有時卻沒有它)

如果看到那個正方形,您就會知道帶有帶字形ID的字形在字體文件中根本不存在。 您必須使用unicode字體。

為了進行測試,您可能需要使用標准Windows字體中的Arial Unicode。

要獲取ARIALUNI.TTF(Arial Unicode):

  1. 打開開始菜單( Windows-key )並輸入: font
  2. 打開“顯示已安裝的字體”
  3. 在“字體”窗口中搜索( F3Arial Uni
  4. 尋找Arial Unicode MS Standard
  5. 將其拖放到例如桌面(或任何其他地方)上

將該字體用於unicode文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM