質問: utf-8で参考書を写経しましたが、Babelでコンパイルして実行すると下記の様に文字化けします。'佐藤真央'を``で囲むと回避できました。すごい初歩的なことなのかもしれませんが、理由がよくわかりません。 値はä1⁄2è—¤çœŸå¤® ``` function hoge(value) { return new Promise((resolve, reject) => { setTimeout(() => { if (value) { resolve(`値は${value}`); } else { reject('値が空です'); } }, 2000); }); } hoge('佐藤真央').then( response => { console.log(response); }, error => { console.log(error); } ); ```
回答: Babelの問題では無く、JavaScriptを呼び出す環境の問題です。この現象を説明するにはソースファイルの文字コードとBabelの変換の動作の両方について知る必要があります。 ### JavaScriptのソースファイルの文字コードについて JavaScriptではソースファイル(.jsのファイル)の文字コードに関する規定がありません。JavaScriptでの文字列(string)はUnicodeコードポイントとして解釈され、内部ではUTF-16で管理されますが、ソースファイル自体がどの文字コードであるかは仕様で定められていません。 参考: ECMAScript® 2016 Language Specification #11.8.4String Literals ある文字コードのソースファイルをUnicodeコードポイントに変換するのは**JavaScriptエンジン**の仕事です。そして、どの文字コードとして読み込むのかを決めるのもJavaScriptエンジンが行います。これは使い方やエンジンの種類によって異なります。 #### HTMLから使用するJavaScript HTMLの`script`要素で`src`属性を使って読み込んだ場合は、デフォルトではHTML自身の文字コードになります。また、`script`要素の`charset`属性で任意の文字コードに指定できます。 参考: HTML 5.1: 4.12. Scripting #4.12.1.1. Processing model より(訳は私訳) > > If the `