はじめに
皆さんこんにちは。GitHubの水谷と申します。GitHubでは、ビジネスサポートエンジニアという肩書きで企業向けサービスであるGitHub EnterpriseやGitHub Business Cloudのお客様のテクニカルサポートをしています。
GitHubはソースコード、コミットメッセージ、Issue/Pull Requestなど全ての機能においてマルチバイト文字に対応しています。しかし、特定の条件の下では意図せず文字化けが発生することがあります。この記事では文字化けが発生する条件、そのメカニズム、そして対策を解説します。
そもそもGitHubとは?
連載の1回目なので、まずはGitHubについて簡単に紹介します。GitHubは、Gitを軸とした世界最大のソフトウェア開発プラットフォームです。しかし、これは一つの側面にしか過ぎません。GitHubでは自身を "GitHub is how people build software" と定義していますが、これはつまりGitHubが単純なコラボレーションツール(what/where)という枠を超えた、ソフトウェア開発の在り方そのもの(how)である、といった意図が込められています。
GitHubは2008年に米サンフランシスコで創業されました。そのPull Requestと呼ばれる独特なコラボレーション機能が注目され、この10年で急成長を遂げました。2018年現在、GitHub.com上には2800万人のユーザが8500万ものリポジトリを保持しており、主要なオープンソースプロジェクトはほとんどGitHub上にあるため、ソフトウェア開発プラットフォームのデファクトスタンダードになっています。
2015年6月には日本法人としてギットハブ・ジャパンを設立し、2016年には企業向けのGitHubであるGitHub Enterpriseのお客様へ日本語テクニカルサポートを開始しました。更に、2017年6月、2018年6月と2年続けて東京でGitHub主催のカンファレンスを開催し、日本語ブログも開設するなど、日本のコミュニティに向けた展開にも注力しています。
文字化けが発生する条件
それでは今回のトピックに戻りましょう。文字化けが発生する対象はDiff画面(差分画面)です。Diff画面とは、例えばPull Requestを作成すると、変更されたファイルが一覧表示されますが、その画面のことです。あるいは同様に、各コミットのページにアクセスしても直前のコミットとの差分が一覧表示されます。このDiff画面において文字化けが発生するケースを見ていきます。
このスクリーンショットは、lowply/garbled-diff-testというリポジトリに新しいファイルを追加した際の最初のコミットの画面の一部です。全てのコミット内容はコミットf074f92で確認できます。
各ファイルは全て同じJavaScriptのソースコードで、日本語の文字列が含まれています。それぞれエンコーディング方式はShift_JIS、EUC-JP、UTF-8の3種類、拡張子は.js
と.src
の2種類の合計6ファイルです。ファイル名は「example-エンコーディング名.拡張子」というフォーマットにしています。
お気づきのように、これらのファイルのうちexample-euc.srcとexample-sjis.srcの2ファイルが文字化けしているのがわかります。結論から言うと、下記の条件が揃った場合Diff画面で文字化けが発生します。
- マルチバイト文字が使われている
- エンコーディングがUTF-8ではない
- プログラミング言語が判定できない
最近はエンコーディングにUTF-8が使われるケースがほとんどですし、GitHubで判定できない言語を使うことも少ないと思うので、これらの条件が全て揃うのは稀かもしれません。ですが、Windowsで作られたシステムなどではまだCP932を使用している例もあるのではないでしょうか。あるいは、特定のシステム向けに独自の拡張子を使っていて、使用できるエンコーディングが指定されている場合などは、かなり高い確率でこの条件に当てはまるでしょう。
なお、example-sjis.srcをファイルビューで表示しても、このように文字化けは発生していません。発生するのはDiff画面のみなのです。