Lavorare con la tabella "Nome" | C ++

La tabella dei caratteri TrueType ‘Nome’ è l’archiviazione per le stringhe di testo relative a quel carattere. Queste stringhe possono essere scritte in diverse lingue e possono rappresentare varie entità, come nomi di caratteri, nomi di familiari, nomi di design, informazioni sulla licenza, avvisi di copyright e così via. In breve, le righe che sono trattenute nella tabella “nome” descrivono i metadati del carattere.

Schema della tabella “Nome”.

La tabella dettagliata per la tabella “Nome” è accessibile in Microsoft e Apple Documentazioni.

Esistono 2 formati per una tabella “nome” con numeri 0 e 1 di conseguenza. In termini di tabella “Nome”, questi numeri di formato sono denominati come versione, quindi il formato 0 è designato come versione 0 e il formato 1 - come versione 1.

Il formato 1 differisce dal formato 0 nell’identificazione del linguaggio. Qualsiasi voce nella tabella “Nome” ha un identificatore di lingua, che viene utilizzato per rilevare il linguaggio di quella stringa. E la differenza tra il formato 0 e il formato 1 è nel modo in cui vengono interpretati questi identificatori di linguaggio.

Gli identificatori linguistici per il formato 0 hanno un’interpretazione specifica della piattaforma, ma gli identificatori linguistici per il formato 1 sono associati alle stringhe di tag linguistico, che identificano le lingue indipendentemente dalla piattaforma.

Per una maggiore precisione, il formato 1 consente di mantenere gli identificatori linguistici di entrambi i tipi: identificatori con interpretazione specifica della piattaforma e identificatori associati alle stringhe di tag linguistico (cioè indipendenti da una piattaforma).

Aspose.Font Library supporta il formato 0 della tabella “Nome”. Il supporto per il formato 1 è previsto per le versioni future.

Indipendentemente dal formato che ha la tabella “Nome”, qualsiasi voce in questa tabella si basa su un componente particolare: la struttura NameRecord.

I quattro parametri principali di questa struttura sono:

I parametri platformid, platformspecificid e linguaid vengono utilizzati per impostare il linguaggio della stringa in modo specifico della piattaforma. I valori dei parametri Platformspecificid e Linguaid importa solo nel contesto del parametro PlatformID.

Ad esempio, PlatformSpecificid uguali 0 definisce lo script romano per la piattaforma MAC e allo stesso tempo, PlatformSpecificid definisce lo script romano per la piattaforma Windows. Allo stesso modo il valore di “Linguaid” è importante solo nel contesto del parametro di PlatformID utilizzato.

Ad esempio Linguaid Definizione inglese USA è uguale a 0 per PlatformID = 1 (Mac) e 0x0409 per PlatformID = 3 (Windows).

Le esclusioni sono solo `linguaggio" per il formato della tabella di nome 1, associati a una stringa di tag lingua, che identifica le lingue indipendentemente dalla piattaforma.

Il parametro nameid è un numero, che identifica una categoria di stringa logica, come il nome del carattere, il nome della famiglia e altri. Esiste un set predefinito di identificatori di nome, che è lo stesso per tutte le piattaforme e le lingue.

Quindi, ogni voce della tabella “nome” può essere divisa in 3 parti:

  1. categoria stringa logica,
  2. linguaggio di stringa,
  3. la stringa stessa.

Il parametro nameid è correlato alla prima parte, i parametri platformid, platformspecificid e linguaid sono correlati alla seconda parte.

Come lavorare con i record di tabella “Nome” usando Aspose.Font?

Supporto per la tabella “Nome” è fornito da Class ttfnametable. Inoltre, consideriamo la funzionalità di questo oggetto. Innanzitutto, descriviamo le elencazioni necessarie per lavorare con la funzionalità della classe TtfNameTable.

Come è stato menzionato sopra, “i valori dei parametri Platform SpecificID e LanguageID contano solo nel contesto del parametro PlatformID”. Quindi, quando PlatformID è 0 e questo definisce la piattaforma Unicode, usa UnicodePlatFormSpecificId enumeration, quando PlatformID è 1 (piattaforma Macintosh), usa MacPlatformSpecificId enumeration e quando PlatformID è 3 (piattaforma Windows), usa msplatformspecifid enumerazione.

Le enumerazioni mslanguageid e MacLanguageId sono correlate al parametro LanguageId. Utilizzare MSLanguageId enumeration, quando PlatformID è 3 (piattaforma Windows) e usa MSLanguageId enumeration quando PlatformID è 1 (piattaforma Macintosh).

Procediamo ora con la questione di ottenere e rinfrescare voci dalla tabella ‘Nome.

Come ottenere record dalla tabella “Nome”?

Cominciamo dal metodo getAllnamerecords (). Questo metodo, come segue dal suo nome, restituisce tutte le voci senza esclusioni della tabella “Nome”. In pratica il metodo non viene spesso chiamato come utenti nella maggior parte dei casi non hanno bisogno di tutte le voci, quindi per ottenere la voce necessaria, l’elenco delle voci deve essere accuratamente filtrato.

La questione è che anche in una categoria logica, la fontfamily, ad esempio, i dati di stringa di questa categoria possono essere in lingue diverse. Quindi ogni lingua ha bisogno di una voce separata nella tabella “Nome” per questa categoria logica. Come se i dati per la categoria di fontfamily esistessero in inglese, francese e tedesco, la categoria di fontfamily includerebbe 3 voci.

Inoltre, la voce del linguaggio può essere divisa in alcune voci che coincidono per valori di dati di stringa e valore “Linguaid”, ma differiscono per i valori dei parametri “PlatformID” e “Platformspecificid”.

Per semplificare il campionamento dei dati dalla tabella “Nome” Aspone.Font Library offre i metodi successivi:

  1. Questo record è scritto in inglese, quindi ha il valore mslanguageid.english_united_states o mslanguageid.english_united_kingdom per il parametro LanguageId.
  2. Questo record ha PlatformID con il valore pari a Fontenvironment.Current.CurrentPlatformid (3 nell’implementazione corrente, che dichiara la piattaforma Microsoft).

Come aggiungere/aggiornare i record nella tabella “Nome”?

Classettfnametablefornisce un metodo addName per aggiungere o aggiornare i record nella tabella “nome”. Questo metodo crea la struttura del tipo namerecord e lo inserisce nella tabella “nome”. Se il record coincide con quello aggiunto per parametri PlatformId, Platformspecificid, Linguaid e nameId esiste già, il metodo non aggiunge un nuovo record, ma aggiorna i dati di stringa nel record esistente usando il valore, definito dal parametro nome.

Il parametro nameID definisce la categoria stringa logica per un record. I parametri platformid, platformspecificid e linguaid vengono utilizzati per impostare il linguaggio della stringa. E l’ultimo parametro nome viene utilizzato per impostare i dati di stringa per un record.

Esempi di utilizzo delle funzioni dell’oggetto TtfNameTable.

Aggiungi include e usando gli spazi dei nomi:

 1#include <sistema/text/string_builder.h>
 2#include <System/enum.h>
 3#include <System/Console.h>
 4#include <Sistema/Collezioni/List.h>
 5#include <aspose.font.cpp/src/ttftables/ttfnetable.h>
 6#include <aspose.font.cpp/src/ttftables/ttftableSepository.h>
 7#include <aspose.font.cpp/src/ttf/ttffont.h>
 8#include <aspose.font.cpp/src/multilanguagestring.h>
 9#include <aspose.font.cpp/src/fontttype.h>
10#include <aspose.font.cpp/src/font.h>
11
12using namespace System;
13using namespace Aspose::Font::Ttf;
14using namespace Aspose::Font::TtfTables;

Dichiarare e inizializzare una variabile di carattere.

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

Valore di stampa di 2 frammenti successivi per categoria * Nome carattere completo * e produrre lo stesso risultato per il carattere lora-regolare

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));

Stampa l’intero contenuto della tabella “Nome”.

Lo snippet seguente mostra come realizzare questa operazione.

 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    }

Aggiornamento dei valori per le categorie “Nome della sottofamiglia dei caratteri” e “Descrizione”

Per aggiungere o aggiornare la voce nella tabella ‘Nome’ correttamente, dobbiamo passare i valori di PlatformID, PlatformSpecificid e Linguaid ID che coincidono con quelli che sono già presenti nella tabella ‘Name’. Per questo, prima di rinfrescare i dati leggeremo i record esistenti del tipo Namerecord rilevante per la categoria logica rinfrescante, definita dall’identificatore di nome.

 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	}

Altri esempi per rinfrescare la tabella “Nome” che puoi trovare nel test Soluzione metadataexamples.cpp.

Have any questions about Aspose.Font?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.