Unicode絵文字を表示する #CSS #Javascript version 3

2016/03/09 00:49 by zk33 zk33
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
ChromeでUnicode絵文字を表示する #バッドノウハウ #CSS #Javascript
まず前提として、
まず前提として、絵文字を含んだfont-faceを作る必要がある。
ただ、OSXのChromeが非常に厄介な問題を抱えているため、色々と工夫が必要。

mimemoの場合

```CSS
@font-face {
  font-family: emoji;
  //unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; // ※Chrome49でunicode-range指定するとダメになったのでコメントアウト
  src:local('Webdings'),// Chromeの挙動が変なので何か適当にフォント指定が必要だが実際の文字に影響のないものにする
  /* unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; // ※Chrome49でunicode-range指定するとダメになったのでコメントアウト*/
  src:local('Helvetica Neue'),
      local('Apple Color Emoji'),
      local('Android Emoji'),
      local('Segoe UI'),
      local(EmojiSymbols),
      local(Symbola),
      url('font/Symbola-Emoji.eot?#iefix') format('embedded-opentype'),
      url('font/Symbola-Emoji.woff') format('woff'),
      url('font/Symbola-Emoji.ttf') format('truetype');
  //font-weight: normal; // chromeでfont-weightが600以上/boldなところでは絵文字が出ないバグがあるのでこちらで上書きしておく。Chromeのバグなおったらはずす
}

@font-face {
  font-family: emojiBold;
  /* unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; // ※Chrome49でunicode-range指定するとダメになったのでコメントアウト*/
  src:local('Helvetica Neue'),
      local('Apple Color Emoji'),
      local('Android Emoji'),
      local('Segoe UI'),
      local(EmojiSymbols),
      local(Symbola),
      url('font/Symbola-Emoji.eot?#iefix') format('embedded-opentype'),
      url('font/Symbola-Emoji.woff') format('woff'),
      url('font/Symbola-Emoji.ttf') format('truetype');
  font-weight: 500;
}
```

こういうを作って
こうして`emoji`、`emojiBold`というfont-faceを作って

```
body{
  font-family:emoji,sans-serif;
  font-family: -apple-system, 'Roboto','Segoe UI',emoji, 'Helvetica Neue','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3', Meiryo, メイリオ, 'MS PGothic', sans-serif;
}
strong{
  font-family: -apple-system, 'Roboto','Segoe UI',emojiBold, 'Helvetica Neue','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3', Meiryo, メイリオ, 'MS PGothic', sans-serif;
}
```
とかにすると絵文字が出る。
のだけど、Chromeが結構やんちゃで、

* Chromeにはfont-weight:600以上の部分にUnicode絵文字が出ない事がある、という不具合?がある
* 全てのUnicode絵文字が出ないわけではなく、スマホから入力され絵文字などが出な事が多い
* 出ない絵文字は[異体字セレクタ](https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)で「U+FE0E」「U+FE0F」が追加されて場合の模様
[→参考](http://seesaawiki.jp/w/qvarie/d/%A5%E6%A5%CB%A5%B3%A1%BC%A5%C96.1%B0%CA%B9%DF%A4%C7%BB%C8%CD%D1%A4%C7%A4%AD%A4%EB%B3%A8%CA%B8%BB%FA)
たいにす

【対処】
どうしようもないのでChromeの場合には異体字セレクタを消す処理を追加した
* `emoji`のみでいきたかったのだけど、`emoji`だけだと太字にした箇所の欧文が細くなる
* Chromeにはfont-weight:600以上の部分にUnicode絵文字が出ない事がある、という不具合があるため、太字のfont-faceは`font-weight:500`にする。Helvetica Neueを使う場合は500でMedium相当の文字が出るのでウェイトとしてもちょういい塩梅
* `emoji`をフォントの先頭に置くと他の環境でフォントが残念なことになるよなので、`-apple-system`などOSXのChromeでは使えないが他の環境にあるフォントは`emoji`より前に置く
* さらにChromeでスマホから入力された絵文字が出ない事があり、出ない絵文字は[異体字セレクタ](https://ja.wikipedia.org/wiki/%E7%95%B0%E4%BD%93%E5%AD%97%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF)で「U+FE0E」「U+FE0F」が追加されてる場合の模様 [→参考](http://seesaawiki.jp/w/qvarie/d/%A5%E6%A5%CB%A5%B3%A1%BC%A5%C96.1%B0%CA%B9%DF%A4%C7%BB%C8%CD%D1%A4%C7%A4%AD%A4%EB%B3%A8%CA%B8%BB%FA)
* というわけで、どうしようもないのでChromeの場合には異体字セレクタを消す処理を追加したりもした
参考:https://github.com/mathiasbynens/strip-variation-selectors


## 更新履歴

* Chrome 49で今度は`unicode-range`の指定が悪影響を及ぼすようになったので、フォントの最初のをWebdingsにして`unicode-range`の指定を消すという感じに更新した      

まず前提として、絵文字を含んだfont-faceを作る必要がある。
ただ、OSXのChromeが非常に厄介な問題を抱えているため、色々と工夫が必要。

mimemoの場合

@font-face {
  font-family: emoji;
  /* unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; // ※Chrome49でunicode-range指定するとダメになったのでコメントアウト*/
  src:local('Helvetica Neue'),
      local('Apple Color Emoji'),
      local('Android Emoji'),
      local('Segoe UI'),
      local(EmojiSymbols),
      local(Symbola),
      url('font/Symbola-Emoji.eot?#iefix') format('embedded-opentype'),
      url('font/Symbola-Emoji.woff') format('woff'),
      url('font/Symbola-Emoji.ttf') format('truetype');
}
@font-face {
  font-family: emojiBold;
  /* unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; // ※Chrome49でunicode-range指定するとダメになったのでコメントアウト*/
  src:local('Helvetica Neue'),
      local('Apple Color Emoji'),
      local('Android Emoji'),
      local('Segoe UI'),
      local(EmojiSymbols),
      local(Symbola),
      url('font/Symbola-Emoji.eot?#iefix') format('embedded-opentype'),
      url('font/Symbola-Emoji.woff') format('woff'),
      url('font/Symbola-Emoji.ttf') format('truetype');
  font-weight: 500;
}

こうしてemojiemojiBoldというfont-faceを作って、

body{
  font-family: -apple-system, 'Roboto','Segoe UI',emoji, 'Helvetica Neue','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3', Meiryo, メイリオ, 'MS PGothic', sans-serif;
}
strong{
  font-family: -apple-system, 'Roboto','Segoe UI',emojiBold, 'Helvetica Neue','Hiragino Kaku Gothic ProN','ヒラギノ角ゴ ProN W3', Meiryo, メイリオ, 'MS PGothic', sans-serif;
}

みたいにする。

  • emojiのみでいきたかったのだけど、emojiだけだと太字にした箇所の欧文が細くなる
  • Chromeにはfont-weight:600以上の部分にUnicode絵文字が出ない事がある、という不具合があるため、太字のfont-faceはfont-weight:500にする。Helvetica Neueを使う場合は500でMedium相当の文字が出るのでウェイトとしてもちょうどいい塩梅
  • emojiをフォントの先頭に置くと他の環境でフォントが残念なことになるようなので、-apple-systemなどOSXのChromeでは使えないが他の環境にあるフォントはemojiより前に置く
  • さらにChromeでスマホから入力された絵文字が出ない事があり、出ない絵文字は異体字セレクタで「U+FE0E」「U+FE0F」が追加されてる場合の模様 →参考
  • というわけで、どうしようもないのでChromeの場合には異体字セレクタを消す処理を追加したりもした
    参考:https://github.com/mathiasbynens/strip-variation-selectors