『Failed to decode downloaded font』から始まるエラー

このエラーの意味が分からずにgoogle検索しまくること、2日あまり経ちましたが、諦めずに探し続けることが大事ですね。

ちなみにエイプリルフールですが、フランスが発祥という説があるみたいですね。

話がそれましたが、

  解決策は下記サイトへ

アイコンフォントをgit管理するとファイルが破損するときの対応方法 | jMatsuzaki

原因はgitの改行コードを自動変換する仕組み

Webフォントは、バイナリーファイルで、gitが改行コードのCRLFをLFに自動変換する処理において、バイナリー内のCRLFまでLFに書き換えてしまうことで、バイナリーが壊れてしまっていたことが原因らしいです。 

gitの改行コードはLF(ラインフィード)

gitはもともとLinuxの生みの親、リーナス・トーバルズによってLinuxカーネルソースコード管理に用いるために開発されたので、Linuxの改行コード、LF(ラインフィード)が採用されてるようです。

Linuxと互換性の高いMacは、改行コードがLFですが、Windowsは改行コードがCRLF(キャリッジリターン+ラインフィード)というものらしいです。

gitにより、OSで異なる改行コードをLFに統一されてるようです。

通常、画像ファイルなどのバイナリーファイルは、gitの改行コード自動変換の対象にはならないのですが、Webフォントはバイナリーファイルであるにも関わらず、gitの改行コードの対象外にはなっていないため、Webフォント内でCRLFの改行コードが使用されている場合、バイナリーが破壊されてしまうため、下記のようなエラーが出るようです。

Failed to decode downloaded font: [アイコンフォントのURL]
OTS parsing error: post: table overruns end of file
OTS parsing error: incorrect file size in WOFF header

.gitattributesファイルを編集して問題を回避

gitにWebフォントがバイナリーファイルであることを認識させれば、この問題は回避されるようで、そのためには、『.gitattributes』というファイルに追加の記述をれば良いようです。

『.gitattributes』ファイルを開くと下記のようになっています。

# Define the line ending behavior of the different file extensions
# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto
* text eol=lf

# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
*.php text
*.default text
*.ctp text
*.sql text
*.md text
*.po text
*.js text
*.css text
*.ini text
*.properties text
*.txt text
*.xml text
*.yml text
.htaccess text

# Declare files that will always have CRLF line endings on checkout.
*.bat eol=crlf

# Declare files that will always have LF line endings on checkout.
*.pem eol=lf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary

このファイルの『# Denote all files that are truly binary and should not be modified.』となっている部分の末尾に下記のコードを追加記述し保存します。

*.otf binary
*.eot binary
*.svg binary
*.ttf binary
*.woff binary

壊れたWebフォントは、新しくダウンロードしたものに入れ替えましょう。

gitで管理してる場合に、Webフォントを使ってる場合は今回の方法でエラーに対応できるようです。