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