JavaScriptを利用してPDFに設定するフォントが文字化けする

macでファイルを作成し濁点を含むファイル名を設定したところ文字が豆腐になってしまったいました。

Image from Gyazo

ファイル名ではかんばん設置サンプル.pngと入力したところが化けています。

フォントが不足しているか?

今回PDFに作成しているライブラリはpdfmake.orgを利用しており、日本語のフォントはフォントファイルを追加して表示しています。そのため追加しているフォントが不足しているのだろうか?と思ったわけですが、ちょっと様子が違います。

「ば」が文字化けしているのですが、化けているもじのうちの「は」は表示されています。「ぷ」についても同じです。「フ」は表示されているけれども「プ」にはなっていないのです。

とりあえず文字コードを確認する

何が起こっているのかちょっとわからなかったので、とりあえず対象の文字列をエディターに貼り付けてこちらのサイトで文字コードを確認しました。

www.marbacka.net

そうすると、手元のエディタで入力してPDFに正しく表示されている「ば」はU+3070で文字化けする「ば」はU+306Fとなっていることがわかりました。

なるほど、文字コードが異なるので表示できないわけかとわかりました。

どういうこと?

ここまできてようやくunicodeにおける結合文字列というものにたどり着きました。

tama-san.com

どうやら今回私が入力した「ば」は「は」と「゛」から構成される2文字でこれが一文字と見えるようになっていたようです。

たしかに、今回文字化けしているもじはmac上でファイル名を入力したものなので事象としても納得です。

どう対応するか?

ここまできてフォントが不足しているわけではないことがわかりました。理想的には結合文字列をふつうの文字列に変換してくれればそれで問題が解決するなぁと思いつつこちらにたどり着きました。

qiita.com

最終的にはこちらにある通りJavaScriptのString.prototype.normalize()を利用してファイル名については普通の文字列に変換する処理を追加して文字化けが解消することを確認しました。

さいごに

ここまでたどり着くまであれこれと試してみたのですが、当初想定していた問題とは違っていました。しかも原因が同じOSで同じ文字を入力しても状況によって文字コードが異なるというちょっと想定外のことだったのが驚きでした。

いろいろな方がそれぞれの知見を公開していただいていたおかげで問題とその対応方法にたどり着けました。参考にしたサイトのみなさまに感謝いたします。ありがとうございました。

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

ValidationAttributreでDIされたオブジェクトを取得する

こんにちは。beaglesoftの真鍋です。

このところ、開発しているときにあれどうだったっけ…?ってGoogleとかで検索をすると過去に書いたブログのエントリーが表示されることがあり記録を残すことは大事だと痛感してながら開発をしています。

以前同じような内容をASP.NET MVC5でまとめたのですが、ASP.NET MVC Coreでどうするのかをまとめていなかったのでこちらにまとめます。

blog.beaglesoft.net

やりたいこと

通常コントローラーのリクエストでバインドされるフィールドの値は検証処理を行うと思います。その検証処理は形式的なチェックもあると思うのですが、例えば登録済みのメールアドレスかどうかをチェックするというようなものもあると思います。この処理をデータベースの登録前に実行するということはもちろん必要ですが、コントローラーからサービスへ処理を行うまでにそもそも実行する必要がないものを弾きたいことはあると思います。

そのようなユースケースではValidationAttributreを利用して独自に検証処理を作成することができます。

今回はValidationAttributreでStartup.csなどでDIされたオブジェクトを利用する方法をまとめます。

具体的な方法

ValidationAttributreでDIされたオブジェクトを利用するためには、ValidationAttribute#IsValid(object value, ValidationContext validationContext)をオーバーライドして利用します。

IsValid(object value, ValidationContext validationContext)validationContextには GetService(Type serviceType) が定義されているので、このメソッドからDIしているオブジェクトを取得できます。

var service = (ISomeService) validationContext.GetService(typeof(ISomeService));

これでValidationAttributeでもDIされたオブジェクトを利用することができるようになるため、いろいろな検証処理をリクエストまでに実行することができるようになりますね。

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

PostgresでUUIDを生成する

こんにちは。ビーグルソフトの真鍋です。

前回のUUID生成と同じくPostgresでUUIDを生成したくなったので調べてみました。実際にはRDS上のPostgresを利用しているので参考にしてみてください。

blog.beaglesoft.net

バージョン情報

=> SELECT version();
                                                 version
----------------------------------------------------------------------------------------------------------
 PostgreSQL 9.6.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
(1 row)

生成方法

UUIDをPostgresで生成するにはpgcryptoが必要になります。

F.25.5. ランダムデータ関数

そのためあらかじめExtensionがインストールされていることを確認します。

=> SELECT * FROM pg_available_extensions WHERE name = 'pgcrypto';
   name   | default_version | installed_version |         comment
----------+-----------------+-------------------+-------------------------
 pgcrypto | 1.3             | 1.3               | cryptographic functions
(1 row)

今回はすでにインストールされていますが、インストールするには以下のSQLを実行します。

=> CREATE EXTENSION if not exists pgcrypto;
NOTICE:  extension "pgcrypto" already exists, skipping
CREATE EXTENSION

以下の通りgen_random_uuidを実行するとuuidのバージョン4を生成してくれます。

=>  select gen_random_uuid();
           gen_random_uuid
--------------------------------------
 e61de8d7-2822-4544-9c92-4ce89f667396
(1 row)

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)