网上搜到的代码转换不过来,因为读出来的信息是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;
}