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”.
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:
- Platform Identifier (PlatformID),
- Identificatore specifico della piattaforma (PlatformSpecificid),
- Nome Identifier (nameID),
- e Identificatore linguistico (Linguaid).
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:
- categoria stringa logica,
- linguaggio di stringa,
- 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.
- Le enumerazioni nameID e PlatformId sono correlate a tali parametri sopra descritti come nameID e PlatformID.
- Le enumerazioni UnicodePlatFormSpecificid, MacPlatformSpecificid sono correlate a Parameter PlatformspecificIDID.
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:
- GetnamerecordsbynameId ()- Restituisce l’elenco delle voci per l’imposta per la categoria logica dell’utente, definito dal parametro
nameid
. - GetMultiLanguagenameById () - Restituisce tutte le voci, rilevanti per la categoria logica passata NameID come oggetto di tipo multilanguageString. Per mezzo dell’oggetto del tipo - MultiLanguageString, possiamo scoprire tutte le lingue di questa categoria e ottenere i dati di stringa per il linguaggio set. Puoi ottenere l’elenco di tutte le lingue chiamando il metodo getAllLanguageIds() del tipomultilaganguagestring. Dopo aver ricevuto l’elenco delle lingue, possiamo chiamare il metodo GetStringForLanguageId() per ciascun linguaggio. Questo metodo restituisce la stringa di dati scritta in questa lingua.
- Classe multilaganguageString* offre anche i metodi successivi:
- Contiene String (String Str)- Verifica se una stringa passata è presente all’interno di tutte le stringhe linguistiche dell’oggetto.
- GetEnGlishString() - Restituisce una stringa scritta in inglese se trovata. Restituisce la prima stringa, il cui linguaggio è mslanguageid.english_united_states, mslanguageid.english_australia, mslanguageid.english_united_kingdom, mslanguageid.english_canada o mslanguageid.english_new_zealand. Se non ci sono stringhe con l’identificatore del linguaggio pertinente, il metodo restituisce la prima stringa dell’elenco.
- GetAllStrings() - Restituisce tutte le stringhe di tutte le lingue che l’oggetto include.
- Il metodo più semplice da usare della classettfnametableè getNameById(), che è stato progettato per i casi in cui è necessario ottenere il valore per la categoria impostata in inglese. Questo metodo cerca un record, corrispondente a 2 criteri:
- Questo record è scritto in inglese, quindi ha il valore mslanguageid.english_united_states o mslanguageid.english_united_kingdom per il parametro LanguageId.
- 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.