从ttf原始文件解析出字体名称时遇到的字节序的问题是big endian

xiaoxiao2021-02-28  40

网上搜到的代码转换不过来,因为读出来的信息是big endian的unicode类型。高低字节是颠倒的,必须首先转换过来。

LPCSTR GetFontNameFromFile(LPSTR lpszFilePath, LPSTR chinesename, LPSTR englishname) {

 USES_CONVERSION;  FILE* f;  static char csRetVal[128];

 memset(csRetVal, 0, sizeof(csRetVal));  int nPos;  //char tmp[256];  //char tmp2[256];

 strcpy(chinesename, "");  strcpy(englishname, "");

 f = fopen(lpszFilePath, "rb");

 if (f == NULL)  {   return csRetVal;  }

 TT_OFFSET_TABLE ttOffsetTable;

 fread(&ttOffsetTable, sizeof(TT_OFFSET_TABLE),1,f);  ttOffsetTable.uNumOfTables = SWAPWORD(ttOffsetTable.uNumOfTables);  ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion);  ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);

 //checkisthisisatruetypefontandtheversionis1.0  if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)  {   fclose(f);   return csRetVal;  }

 TT_TABLE_DIRECTORY tblDir;  BOOL bFound = FALSE;  char csTemp[64];

 for (int i = 0; i<ttOffsetTable.uNumOfTables; i++)  {   fread(&tblDir, sizeof(TT_TABLE_DIRECTORY),1,f);   memset(csTemp, 0, sizeof(csTemp));   strncpy(csTemp,tblDir.szTag, 4);

  if (stricmp(csTemp,"name") == 0)   {    bFound = TRUE;    tblDir.uLength = SWAPLONG(tblDir.uLength);    tblDir.uOffset = SWAPLONG(tblDir.uOffset);    break;   }  }

 if (bFound)  {   fseek(f, tblDir.uOffset, SEEK_SET);

  TT_NAME_TABLE_HEADER ttNTHeader;   fread(&ttNTHeader, sizeof(TT_NAME_TABLE_HEADER), 1, f);   ttNTHeader.uNRCount = SWAPWORD(ttNTHeader.uNRCount);   ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset);   TT_NAME_RECORD ttRecord;   bFound = FALSE;

  for (int i = 0; i < ttNTHeader.uNRCount; i++)   {    fread(&ttRecord, sizeof(TT_NAME_RECORD), 1, f);    ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);    if ((ttRecord.uNameID == 1) && (ttRecord.uEncodingID == 256))    {     ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);     ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);     nPos = ftell(f);     fseek(f, tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset, SEEK_SET);     if (ttRecord.uStringLength > 0)     {      memset(csRetVal, 0, sizeof(csRetVal));      fread(csRetVal, 1, ttRecord.uStringLength, f);

      {        for (int i = 1; i < ttRecord.uStringLength; i += 2)        {         swap(csRetVal[i], csRetVal[i-1]);        }

//中文名

       if (ttRecord.uLanguageID == 1032)        {         strcpy(chinesename, W2A((LPWSTR)csRetVal));        }        else if (ttRecord.uLanguageID == 2308)        {

//英文名         strcpy(englishname, W2A((LPWSTR)csRetVal));        }       }

    }     fseek(f, nPos, SEEK_SET);    }   }  }

 fclose(f);  return csRetVal; }


转载请注明原文地址: https://www.6miu.com/read-79356.html

最新回复(0)