Arbeiten mit der Tabelle „Name“ | C++

Die TrueType-Schriftarttabelle „Name“ ist der Speicher für Textzeichenfolgen, die sich auf diese Schriftart beziehen. Diese Zeichenfolgen können in verschiedenen Sprachen geschrieben sein und verschiedene Entitäten darstellen, z. B. Schriftartnamen, Familiennamen, Designernamen, Lizenzinformationen, Urheberrechtshinweise usw. Kurz gesagt beschreiben die Zeilen, die in der Tabelle „Name“ enthalten sind, Schriftartmetadaten.

Schema der Tabelle „Name“.

Die detaillierte Spezifikation für die Tabelle „Name“ ist in den Dokumentationen von Microsoft und Apple verfügbar.

Es gibt zwei Formate für eine Namenstabelle mit den entsprechenden Zahlen 0 und 1. In Bezug auf die Tabelle „Name“ werden diese Formatnummern als Version bezeichnet, sodass Format 0 als Version 0 und Format 1 als Version 1 bezeichnet wird.

Format 1 unterscheidet sich von Format 0 in der Sprachidentifikation. Jeder Eintrag in der Tabelle „Name“ verfügt über eine Sprachkennung, die zur Erkennung der Sprache dieser Zeichenfolge verwendet wird. Und der Unterschied zwischen Format 0 und Format 1 besteht darin, wie diese Sprachkennungen interpretiert werden.

Sprachbezeichner für Format 0 haben eine plattformspezifische Interpretation, Sprachbezeichner für Format 1 sind jedoch mit Sprach-Tag-Zeichenfolgen verknüpft, die Sprachen unabhängig von der Plattform identifizieren.

Für mehr Genauigkeit ermöglicht Format 1 die Beibehaltung von Sprachbezeichnern beider Typen – Bezeichner mit plattformspezifischer Interpretation und Bezeichner, die mit Sprach-Tag-Strings verknüpft sind (d. h. unabhängig von einer Plattform).

Die Aspose.Font-Bibliothek unterstützt Format 0 der Tabelle „Name“. Die Unterstützung von Format 1 ist für zukünftige Versionen geplant.

Unabhängig vom Format der Tabelle „Name“ basiert jeder Eintrag in dieser Tabelle auf einer bestimmten Komponente – der Struktur NameRecord.

Die vier Hauptparameter dieser Struktur sind:

Die Parameter „PlatformID“, „PlatformSpecificID“ und „LanguageID“ werden verwendet, um die Sprache der Zeichenfolge plattformspezifisch festzulegen. Die Werte der Parameter „platformSpecificID“ und „LanguageID“ sind nur im Kontext des Parameters „platformID“ von Bedeutung.

Beispielsweise definiert „platformSpecificID“ gleich 0 die lateinische Schrift für die Mac-Plattform und gleichzeitig definiert „platformSpecificID“ die römische Schrift für die Windows-Plattform. In ähnlicher Weise ist der Wert von „LanguageID“ nur im Kontext des verwendeten PlatformID-Parameters von Bedeutung.

Beispielsweise entspricht „SpracheID“, die Englisch USA definiert, 0 für Plattform-ID = 1 (Mac) und 0x0409 für „Plattform-ID“ = 3 (Windows).

Bei den Ausschlüssen handelt es sich lediglich um „LanguageID“ für das Namenstabellenformat 1, verknüpft mit einer Sprach-Tag-Zeichenfolge, die Sprachen unabhängig von der Plattform identifiziert.

Der Parameter „nameID“ ist eine Zahl, die eine logische Zeichenfolgenkategorie identifiziert, z. B. Schriftartennamen, Familiennamen und andere. Es gibt einen vordefinierten Satz von Namensbezeichnern, der für alle Plattformen und Sprachen gleich ist.

Somit kann jeder Eintrag der Tabelle „Name“ bedingt in 3 Teile unterteilt werden:

  1. logische String-Kategorie,
  2. String-Sprache,
  3. die Zeichenfolge selbst.

Der Parameter „nameID“ bezieht sich auf den ersten Teil, die Parameter „platformID“, „platformSpecificID“ und „LanguageID“ beziehen sich auf den zweiten Teil.

Wie arbeite ich mit „Name“-Tabellendatensätzen mit Aspose.Font?

Unterstützung für die Tabelle „name“ wird von der Klasse TtfNameTable bereitgestellt. Darüber hinaus betrachten wir die Funktionalität dieses Objekts.

Beschreiben wir zunächst die Aufzählungen, die für die Arbeit mit der Funktionalität der Klasse TtfNameTable erforderlich sind.

Wie oben erwähnt: „Werte der Parameter platformSpecificID und languageID sind nur im Kontext des platformID-Parameters von Bedeutung.“ Wenn die Plattform-ID also 0 ist und dies die Unicode-Plattform definiert, verwenden Sie die Aufzählung UnicodePlatformSpecificId, wenn die Plattform-ID 1 ist (Macintosh-Plattform), verwenden Sie die Aufzählung MacPlatformSpecificId und wenn die Plattform-ID 3 ist (Windows-Plattform), verwenden Sie die Aufzählung MSPlatformSpecificId .

Die Aufzählungen MSLanguageId und MacLanguageId beziehen sich auf den Parameter languageID.

Verwenden Sie die MSLanguageId - Enumeration, wenn die Plattform-ID 3 ist (Windows-Plattform), und verwenden Sie die MacLanguageId-Enumeration, wenn die Plattform-ID 1 ist (Macintosh-Plattform).

Fahren wir nun damit fort, Einträge aus der Namenstabelle abzurufen und zu aktualisieren.

Wie erhalte ich Datensätze aus der Tabelle „Name“?

Beginnen wir mit der Methode GetAllNameRecords(). Diese Methode gibt, wie aus ihrem Namen hervorgeht, alle Einträge ohne Ausschlüsse der Tabelle „Name“ zurück. In der Praxis wird die Methode nicht oft aufgerufen, da Benutzer in den meisten Fällen nicht alle Einträge benötigen und daher die Liste der Einträge gründlich gefiltert werden muss, um den benötigten Eintrag zu erhalten.

Tatsache ist, dass selbst in einer Logikkategorie, beispielsweise FontFamily, die Zeichenfolgendaten dieser Kategorie in verschiedenen Sprachen vorliegen können. Daher benötigt jede Sprache einen separaten Eintrag in der Tabelle „Name“ für diese Logikkategorie. Wenn die Daten für die Kategorie „FontFamily“ beispielsweise in Englisch, Französisch und Deutsch vorhanden wären, würde die Kategorie „FontFamily“ drei Einträge enthalten.

Darüber hinaus kann der Spracheintrag selbst in einige Einträge unterteilt werden, die in den String-Datenwerten und dem „LanguageID“-Wert übereinstimmen, sich jedoch in den Werten der Parameter „PlatformID“ und „PlatformSpecificID“ unterscheiden.

Um die Datenerfassung aus der Tabelle „Name“ zu vereinfachen, bietet die Aspose.Font-Bibliothek die folgenden Methoden an:

Sie können die Liste aller Sprachen abrufen, indem Sie die Methode GetAllLanguageIds() vom Typ MultiLanguageString aufrufen. Nachdem wir die Liste der Sprachen erhalten haben, können wir die Methode GetStringForLanguageId() für jede Sprach-ID aufrufen. Diese Methode gibt die in dieser Sprache geschriebene Datenzeichenfolge zurück.

Die Klasse MultiLanguageString bietet außerdem die folgenden Methoden:

  1. Dieser Datensatz ist in Englisch verfasst und hat daher den Wert MSLanguageId.English_United_States oder MSLanguageId.English_United_Kingdom für den Parameter languageID.
  2. Dieser Datensatz hat eine Plattform-ID mit dem Wert FontEnvironment.Current.CurrentPlatformId (3 in der aktuellen Implementierung, die die Microsoft-Plattform deklariert).

Wie füge ich Datensätze in der Tabelle „Name“ hinzu bzw. aktualisiere sie?

Die Klasse TtfNameTable bietet eine Methode AddName zum Hinzufügen oder Aktualisieren von Datensätzen in der Tabelle „Name“.

Diese Methode erstellt die Struktur vom Typ NameRecord und fügt sie in die Tabelle „Name“ ein. Wenn der Datensatz mit dem hinzugefügten übereinstimmt, indem die Parameter „platformID“, „platformSpecificID“, „LanguageID“ und „NameID“ bereits vorhanden sind, fügt die Methode keinen neuen Datensatz hinzu, sondern aktualisiert die Zeichenfolgendaten im vorhandenen Datensatz mithilfe des Werts , definiert durch den Parameter „name“.

Der Parameter „nameId“ definiert die logische Zeichenfolgenkategorie für einen Datensatz. Die Parameter „platformId“, „platformSpecificId“ und „LanguageId“ werden verwendet, um die Sprache der Zeichenfolge festzulegen. Und der letzte Parameter „name“ wird verwendet, um Zeichenfolgendaten für einen Datensatz festzulegen.

Beispiele für die Verwendung von Funktionen des TtfNameTable-Objekts.

Fügen Sie Includes hinzu und verwenden Sie Namespaces:

 1#include <system/text/string_builder.h>
 2#include <system/enum.h>
 3#include <system/console.h>
 4#include <system/collections/list.h>
 5#include <Aspose.Font.Cpp/src/TtfTables/TtfNameTable.h>
 6#include <Aspose.Font.Cpp/src/TtfTables/TtfTableRepository.h>
 7#include <Aspose.Font.Cpp/src/Ttf/TtfFont.h>
 8#include <Aspose.Font.Cpp/src/MultiLanguageString.h>
 9#include <Aspose.Font.Cpp/src/FontType.h>
10#include <Aspose.Font.Cpp/src/Font.h>
11
12Verwenden des Namespace-Systems;
13Verwenden des Namensraums Aspose::Font::Ttf;
14Verwenden des Namensraums Aspose::Font::TtfTables;

Deklarieren und Initialisieren einer Schriftartvariablen.

1	System::SharedPtr<Aspose::Font::Ttf::TtfFont> _font;

Die nächsten 2 Snippets geben den Wert für die Kategorie Vollständiger Schriftname aus und liefern das gleiche Ergebnis für die Schriftart Lora-Regular

1    //1
2	String fullFontName = _font->get_TtfTables()->get_NameTable()->GetNameById(TtfNameTable::NameId::FullName);
3	Console::WriteLine(String::Format(u"Full font name: {0}", fullFontName));
4	//2
5	String fullFontName = _font->get_TtfTables()->get_NameTable()->GetMultiLanguageNameById(TtfNameTable::NameId::FullName)->GetEnglishString();
6	Console::WriteLine(String::Format(u"Full font name: {0}", fullFontName));

Drucken des gesamten Inhalts der Tabelle „Name“.

Der folgende Ausschnitt zeigt, wie dieser Vorgang ausgeführt wird.

 1    System::ArrayPtr<TtfNameTable::NameId> ids = System::Enum<TtfNameTable::NameId>::GetValues();
 2    
 3    for (TtfNameTable::NameId nameId : ids)
 4    {
 5        System::SharedPtr<MultiLanguageString> mlString = _font->get_TtfTables()->get_NameTable()->GetMultiLanguageNameById(nameId);
 6        if (mlString == nullptr)
 7        {
 8            continue;
 9        }
10        System::Console::WriteLine(System::String::Format(u"{0}: {1}", nameId, GetMultiLanguageStringValue(mlString)));
11    }
12
13    //Using of this method has no sense when strings from 'name' table have only single language, but it can be useful when font
14    //'name' table include multilingual strings
15    System::String MetadataExamples::GetMultiLanguageStringValue(System::SharedPtr<MultiLanguageString> mlString)
16    {
17        System::ArrayPtr<int32_t> languages = mlString->GetAllLanguageIds();
18        if (languages->get_Length() == 1)
19        {
20            return mlString->GetEnglishString();
21        }
22        
23        System::SharedPtr<System::Text::StringBuilder> sb = System::MakeObject<System::Text::StringBuilder>();
24        
25        for (int32_t i = 0; i < languages->get_Length(); i++)
26        {
27            int32_t langId = languages[i];
28            sb->Append(System::String::Format(u"{0}: {1}", System::Enum<TtfNameTable::MSLanguageId>::GetName((TtfNameTable::MSLanguageId)langId), mlString->GetStringForLanguageId(langId)));
29            if (i != (languages->get_Length() - 1))
30            {
31                sb->Append(u", ");
32            }
33        }
34        
35        return sb->ToString();
36    }

Werte für die Kategorien „Name der Schriftart-Unterfamilie“ und „Beschreibung“ aktualisieren

Um den Eintrag in der Tabelle „Name“ korrekt hinzuzufügen oder zu aktualisieren, müssen wir die Werte der Parameter platformID, platformSpecificID und languageID übergeben, die mit denen übereinstimmen, die bereits in der Tabelle „Name“ vorhanden sind. Zu diesem Zweck lesen wir vor der Aktualisierung der Daten die vorhandenen Datensätze des Typs „NameRecord“, die für die Kategorie der Aktualisierungslogik relevant sind und durch die Namenskennung definiert werden.

 1	//Struct for update operations
 2	struct UpdateData
 3	{
 4	private:
 5		TtfNameTable::NameId _nameId;
 6		System::String _data;
 7
 8	public:
 9		UpdateData(TtfNameTable::NameId nameId, String data)
10		{
11			this->_nameId = nameId;
12			this->_data = data;
13		}
14
15		TtfNameTable::NameId get_NameId() const
16		{
17			return this->_nameId;
18		}
19
20		String get_StringData() const
21		{
22			return this->_data;
23		}
24	};
25
26	UpdateData recordsToUpdate[] = {
27		UpdateData(TtfNameTable::NameId::FontSubfamily, String(u"Italic")),
28		UpdateData(TtfNameTable::NameId::Description, String(u"New description"))};
29
30	SharedPtr<TtfNameTable::NameRecord> firstRecord = nullptr;
31
32	for(UpdateData updateData : recordsToUpdate)
33	{
34		//Declare variable for NameRecord structure to use for update operations
35		SharedPtr<TtfNameTable::NameRecord> record = nullptr;
36
37		System::ArrayPtr<System::SharedPtr<TtfNameTable::NameRecord>> records = _font->get_TtfTables()->get_NameTable()->GetNameRecordsByNameId(updateData.get_NameId());
38
39		//In this example we will use only info from the first NameRecord structure returned to update font metadata.
40		//Many actual fonts require serious analyze of all NameRecords returned to update metadata correctly
41
42		//Initialize just created variables
43		if (records->get_Length() == 0)
44		{
45			//If no any record was found for current name identifer,
46			//we will use first found record for any name identifier
47			if (firstRecord == nullptr)
48			{
49				firstRecord = GetFirstExistingRecord(_font->get_TtfTables()->get_NameTable());
50			}
51			record = firstRecord;
52		}
53		else
54		{
55			record = records[0];
56		}
57
58		//Add or update record in 'name' table
59		_font->get_TtfTables()->get_NameTable()->AddName(updateData.get_NameId(), StaticCast<TtfNameTable::PlatformId>(record->get_PlatformId()), record->get_PlatformSpecificId(), record->get_LanguageId(), updateData.get_StringData());
60	}
61		
62	System::SharedPtr<Aspose::Font::TtfTables::TtfNameTable::NameRecord> MetadataExamples::GetFirstExistingRecord(System::SharedPtr<Aspose::Font::TtfTables::TtfNameTable> table)
63	{
64	    System::ArrayPtr<System::SharedPtr<TtfNameTable::NameRecord>> records;
65	    for (TtfNameTable::NameId nameId : System::Enum<TtfNameTable::NameId>::GetValues())
66	    {
67	        records = table->GetNameRecordsByNameId(nameId);
68	        if (records->get_Length() != 0)
69	        {
70	            return records[0];
71	        }
72	    }
73        
74	    return table->GetAllNameRecords()->idx_get(0);
75	}

Weitere Beispiele zum Aktualisieren der Tabelle „Name“ finden Sie im Test solution MetadataExamples.cpp.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.