【EDK II】 .UNI File Format
第四弾・・・。眠い。備忘録。
概要
Unicode string fileのフォーマットについての備忘録。
このファイルは,Unicodeファイル内で複数のレイアウトとフォーマットをサポートする。この多彩さが,言語または文字識別子によって,文字をグルーピングすることを可能にする。
Unicode String File Format
EDK II Unicode fileはマッピングされたトークン名に,RFC4646言語コードによって識別される文字をローカライズできる。
EDK II Unicode fileのフォーマットはUTF-16LE。文字内容はUCS-2でなければらない。
文字列の末尾は,次のうち最初に見つかったもので決定される。
・制御文字
・コメント
・ファイルの終わり
・空白行
String File内でコメントはどこにあっても良い。すべてのファイルは,Unicode BOM(Byte Order Mark)文字で始まらなければならない。
従って,編集する際は,UTF-16LEファイル内でUCS-2文字列をサポートするエディタを使用する必要がある。
Common EBNF
以下のEBNFは,UCS-2文字列リテラルを表現するため,(ダブル)クオテーションマーク文字を使用している。下記でセミコロンはコメントである。
(一部上付き文字を"^"つけて書いているので注意)
<US> ::= " " <Letter> ::= { (\u0041-\u005A) } ; 文字 A - Z { (\u0061-\u007A) } ; 文字 a - z <Digit> ::= (\u0030-\u0039) ; 文字 0 - 9 <MS> ::= <US>+ <ME> ::= {<MS>} {<EOL>} <CommentLine> ::= "//" <US>* <PCHars> <EOL> <BlankLine> ::= <EOL> <Chars> ::= (\u0001-\uF6FF) <PChars> ::= { (\u0020-\uF6FF) } {<OpChar>} <OpChars> ::= "\x" [{<Letter>} {<Digit>}] {4} "\" <VChars> ::= (\u0021-\uF6FF) <UnicodeLines> ::= <Token> <Me> [<Ldef> [<String> <ME>]+]+ <Ldef> ::= <CtrlChar> "language" <MS> <LangCode><ME> <HexDigitU> ::= {<Digit>} { (\u0041-\u0046) } ; 文字 A - F { (\u0061-\u0066) } ; 文字 a - f <CtrlChar> ::= <US>* "#" <Token> ::= <CtrlChar> "string" <MS> <Identifier> <Identifier> ::= <Letter> [{<Letter>} {<Digit>} {<UN>}]* <LangCode> ::= <RFC4646> <RFC4646> ::= <Letter>^(2,8) [<ShortExt> <LongExt>*] <ShortExt> ::= "-" [{<Letter>} {<Digit>}]^(1,8) <LongExt> ::= "-" [{<Letter>} {<Digit>}]^(1, ) <UDblQuote> ::= \u0022 ; ダブルクオテーション文字「”」 <String> ::= <UDblQuote> <SContent>* <UDblQuote> <SContent> ::= {<PChars>} {<Attributes>} <Attributes> ::= "\" {"narrow"} {"wide"} {<UDbleQuote>} {"n"} {"r"} {"t"} {"nbr"} {"\"} {"'"}
定義
LanguageCodes:
言語コードは有効なRFC4646言語コードでなければならない。
EscChar:
文字列中の"\"など,いくつかの標準文字列をインクルードするために,文字列はエスケープ文字を接頭辞としていなければならない。エスケープ文字を接頭辞に必要な文字は次のものを含む;バックスラッシュ「\」,クオテーションマーク「'」,ダブルクオテーションマーク「"」,スラッシュ「/」。
バックスラッシュはいつもエスケープ文字を必要とする。
Token:
トークンは数字,上付き・下付き文字,下線文字,ダッシュ文字を含む。
Include:
include行は,文字ファイル内にあった場合,この仕様に準拠した別ファイルを構文解析するのに用いられる。トークンは同じ言語のためのファイルで重複してはならない。
HII String Pack
HII String Packの作成に利用されるUnicodeファイルのフォーマット:
<StringFileFormat> ::= <CommentLine>* <LanguageDefs> <Content>+
次のEBNFは,HII String Pack作成に使用されるUnicodeファイルに特化した内容を記載している。
<Content> ::= {<CommentLine>} {<BlankLine>} {<UnicodeLines>} {<ControlRefactor>} {<LanguageDefs>} {<SecurityLines>} {<IncludeLines>}
HII String Pack作成に使用するUnicodeファイルの他の定義は下記の通り。
<LanguageDefs> ::= <CtrlChar> "langdef" <MS> <LangCode> <MS> <LangDesc> <EOL> <LangDesc> ::= <UDblQuote> <Chars> <UDblQuote> <IncludeLines> ::= <CtrlChar> "include" <UniFile> <EOL> <UniFile> ::= <UDblQuote> <UniFilename> <UDblQuote> <UniFilename> ::= <FilenameChars> <MoreFNameChars>* {".uni"} <FilenameChars> ::= {<Letter>} {<Digit>} <MoreFNameChars> ::= {<Letter>} {<Digit>} {"_"} <CtrlChar> ::= "/" <ControlRefactor> ::= <CtrlChar> "=" <NewCtrlChar> <EOL> <NewCtrlChar> ::= (0x0021 - 0xF6FF)
サンプルファイル
UEFIのUNI Spec v1.3より引用。
// // Cpu I/O Strings // Copyright (c) 2006, Intel Corporation. All rights reserved.<BR> // // This program and the accompanying materials are licensed and made // available under the terms and conditions of the BSD License which // accompanies this distribution. The full text of the license may // be found at: // http://opensource.org/licenses/bsd-license.php // // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS // OR IMPLIED. // /=# #langdef en-US "English, US" #langdef fr-FR "Français" #string STR_PROCESSOR_VERSION #language en-US "NT32 Emulated Processor" #language fr-FR "Processeur Émulé par NT32"
フォントサポート
フォントをサポートするためのEDK II Unicodeファイルの,任意の特徴とエントリをここで定義する。
Syntax:
「#fontdef」・「#font」コマンドの導入,「#string」コマンドを延長,新しいエスケープ文字を追記することで,フォントを拡張する。
Fonts:
との文字列もフォントと関連がある。フォントには,フォントフォント識別子,フォント名,サイズ,スタイルがある。デフォルトでは,文字列はフォント識別子"sysdefault"と関連づけられている。普通これは,標準的なUEFIフォントの19, normalとなっている。
文字列は,最初の #language 属性の前に #string 属性を使用することによって,異なる #font 識別子を使うことが可能になる。
特定の言語の文字列だけ異なる#font属性を使用したい場合は,#language属性の後に#font属性を使用すれば良い。
文字列内の文字も,異なるフォント識別子,フォントサイズフォントスタイルを使用することができる。そのためには,下記の \f エスケープシークエンスを利用すれば良い。これらのエスケープ文字は,EDK2 Build Specificationに記載のものを拡張することができる。
Font Control Character | Description |
\" | ダブルクオテーションの挿入。 |
\\ | バックスラッシュの挿入。 |
\br | Breaking code。 |
\f!identifier! | つぎにつづくもじのフォント識別子を選択する。 |
\fb | 現在の文字列に続く文字を太文字スタイルに切り替える。 |
\fd | 現在の二重下線スタイルに切り替える。現在のスタイルが下線の場合は,二重下線になる。 |
\fe | 次に続く文字をエンボス文字に切り替える。 |
\fh!integer! | 次に続くフォントのサイズを選択する。 |
\fi | 現在の文字列に続く文字を,イタリック文字にする。 |
\fs | 現在の文字列に続く文字を,影文字にする。 |
\fu | 現在の文字列に続く文字を,下線文字にする。 |
\n | キャリッジリターンと改行の挿入。 |
\narrow | 次に続く文字を"狭い"文字にする。 |
\nbr | Non-breaking code。 |
\r | キャリッジリターンの挿入 |
\wide | 次に続く文字を"広い"文字にする。 |
フォント識別子は#fontdefを使用することにより作成される。
#font
#stringsを使用してデフォルトフォントをセットする。
Syntax:
"#font" <MS> font-identifier
Attributes:
font-identifier
==> フォントに関連づけられたCスタイルの識別子。
#fontdef
フォント識別子を特定のフォントファミリー,サイズ,スタイルとかんれんづける。
Syntax:
"#fontdef" <MS> font-identifier <MS> <FontOptions> <EOL> <FontOptions> ::= font-name <MS> font-size [<MS> font-style-list] font-style-list ::= <UDblQuote> [fs-entries] <UDblQuote> fs-entries ::= font-style ["|" font-style]* font-style ::= {"bold"} {"italic"} {"underline"} {"dblunder"} {"shadow"} {"emboss"} {"normal"} font-size ::= (1-9) (0-9)*
Attributes:
font-identifier
==> Cスタイルの識別子
font-name
==> フォントファミリー名をクオテーション文字で囲ったもの。例えば,"Arial"や"Times New Roman"など。
font-size
==> ピクセルでフォントたかさを指定するunsigned型のinteger。たとえば,UEFI標準フォントの高さは,19ピクセルなので,font-sizeは19。
font-style
==> フォントスタイルを指定する0以上のキーワード。"|"で仕切る。
仮に"normal"が使用された場合,他のどのフォントスタイルとも組み合わせられない。特に何も指定しなければ,"normal"と解釈される。
#stringの拡張
EDK II のビルドコマンドは,INFファイルの[Sources]セクションで指定された.uniファイルを構文解析する。ビルドツールは各々のModuleに対して,HII stringファイル中のシンタックスを,AutoGen.cファイル中のバイト配列変換するために,pythonオブジェクトを使用する。
バイト配列を作成するプロセスの詳細は,EDK II Build Specificationを参照すること。
Syntax:
<UnicodeLines> ::= "#string" <MS> <Identifier> <ME> [<FontId>] [<LangLine>]+ <LangLine> ::= "#language" <MS> lang-code <ME> <FontString> <FontString> ::= [<FontId>] [<strings>]+ <FontId> ::= ["#font" <MS> <font-identifier> <ME>] <strings> ::= <String> <ME>
[EDK II Specification中の#stringコマンドの拡張]:
font属性は文字列中の文字で使用されるデフォルトフォントを指定する。
もし,#fontが指定されなかった場合,デフォルトのフォント識別子が使用される。
もし,#font属性が#language識別子の前にあった場合,全ての言語にそのfont属性が適用される。
一方で,もし,#font属性が#language識別子の後にあった場合,その言語の文字列の文字にのみ,font属性が適用される。
#fontは一つ以上の箇所に書いてもいい。なお,その場合,言語のフォント識別子が優先される。
Description:
#fontdef コマンドはフォント識別子を導入し,それを特定のフォントファミリー,サイズ,スタイルと関連付ける。もし,すでにフォント識別子が定義されている場合は,新たな定義は無視される。