niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(Pandoc)Docx/ODT Writer中の文字コードの確認処理

時間を無駄に溶かしたのでメモをする。

はじめにPandocじゃない話を書いておくと、Rは"\uxxxx"でunicode文字を入れることが出来る。"\u2603"とかやれば☃だ。大文字のUを使えば、4桁で済まない文字も入れられるし、上4つを0で詰めておけば先と等価な文字コードとして"\U00002603"が得られる。これは下記のvignettesにもあるので読むとよろしい。

cran.r-project.org

最初、inlineのRのコードの`をescapeさせるにはどうするんだっけ?を調べていて、"\u0060"ってどうするんだっけ…と下記のブログとかを見ていたのでした。

rviews.rstudio.com

で、本題。

ODTやDocxの出力、同じような処理をしているくせに別々にWriter内(あるいはそのサブモジュール)で書いているし、構成というか思想が違うのでこれらの形式間で機能を移植しようと思っても簡単には出来なさそう。それぞれの内部で何をしているのかをみていかないと、思わぬところで詰まりそう…

ということで眺めていたのですが、文字コードの確認処理がそれぞれ入っています。

https://hackage.haskell.org/package/pandoc-2.10.1/docs/src/Text.Pandoc.Writers.Docx.html#isValidChar

https://hackage.haskell.org/package/pandoc-2.10.1/docs/src/Text.Pandoc.XML.html#escapeStringForXML

若干記述が違うし、いったいこれはなんなんだ…ということで、上記のRでの表現方法とあわせて沼ってましたが単に勘違いでした。Docxは上を閉じていないのでアレなんですが、基本的にはこれらの記述は等価ですね。しかしodtのこの上限はどこから…?

…が、よく見るとコメントにここを見ろって書いてある。で、Character Rangeにしっかり書いてあるわけでした。

www.w3.org

ここ由来で"\x10FFFF"が来ているんですね~。

ということでスッキリ。まぁ当面ここの仕様は変わらないだろうし、Docxの方に上限つけたらえぇんちゃう?っていうPRでも書いてみるか…(実害がないのでいらないのではと思うが)