teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

utf8を使えという内容だと勘違いする人が居るみたいですので。

2018/04/07 08:13

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  まず、"\uDBC0\uDC8D"が何かというとこれはサロゲートペアというもので、この二つセットで一つの文字を表しています。JavaScriptでは内部の文字列がUTF-16になっているため、U+10000以上のユニコード文字は必ずサロゲートペアになります。正しく処理されれば**U+10008Dという一つの文字**になります。ただし、この文字は[Supplemental Private Use Area-B](https://en.wikipedia.org/wiki/Private_Use_Areas)(私的領域の一つ)というブロックに属しており、アプリケーションやフォントによって好きな文字を割り当てても良いのですが、互換性のない他のアプリケーションやフォントではその文字は用意されない(または、別の何かになる)ため、文字化けが発生します。ここまではいいでしょうか?
9
9
 
10
- 最初にMySQLへの登録についてです。通常MySQLでユニコード文字列を扱う場合、文字コードとしてutf8またはutf8mb4を使います。デフォルトのまま設定している場合やサイト等を参考にした場合はutf8がほとんどでしょう。しかし、ここに罠があります。このutf8はU+FFFFまでのユニコード文字にしか対応しておらず、**U+10000以上の文字は扱えません**。絵文字(????など)や一部の異字(????など)が対応していないと言っている場合、MySQLがutf8だったためというのがあります。これを解消するには文字コードをutf8mb4に変更するしかありません。一応、途中で変える手順もあるようですが、私は失敗したことがあるので、最悪DB全てを作り直すことも視野に入れてください。ということで、まずはMySQLの文字コードがutf8mb4になっているかを確認してください。utf8mb4でなければU+10008Dを含め絵文字等も登録できません。
10
+ 最初にMySQLへの登録についてです。通常MySQLでユニコード文字列を扱う場合、文字コードとしてutf8またはutf8mb4を使ってることがほとんどだと思います。そして、デフォルトのまま設定している場合や内容が古いサイトや本等を参考にした場合はutf8になっていることがほとんどでしょう。しかし、ここに**utf8の**があります。**utf8はU+FFFFまでのユニコード文字にしか対応しておらず、U+10000以上の文字は扱えません**。絵文字(????など)や一部の異字(????など)が対応していないと言っている場合、MySQLがutf8だったためというのがあります。これを解消するには文字コードをutf8mb4に変更するしかありません。一応、途中で変える手順もあるようですが、私は失敗したことがあるので、最悪DB全てを作り直すことも視野に入れてください。ということで、まずはMySQLの文字コードがutf8mb4になっているかを確認してください。**utf8の場合はU+10008Dを含め絵文字等も登録できません。**utf8mb4に変更してください。
11
11
 
12
12
  次にブラウザ側の文字化けです。MySQLへの登録されうまくいけば、ブラウザまではU+10008Dを渡すことができます。しかし、この文字は私的領域であるため、ブラウザにこの文字を表示するためのグリフ(図形)を持つフォントはありません。方法は二つです。
13
13
 

1

強調を増やす

2018/04/07 08:13

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -5,9 +5,9 @@
5
5
 
6
6
  それぞれ分けて考えます。なお、PHPのコードは全てUTF-8で処理していることが前提です。
7
7
 
8
- まず、"\uDBC0\uDC8D"が何かというとこれはサロゲートペアというもので、この二つセットで一つの文字を表しています。JavaScriptでは内部の文字列がUTF-16になっているため、U+10000以上のユニコード文字は必ずサロゲートペアになります。正しく処理されればU+10008Dという文字になります。ただし、この文字は[Supplemental Private Use Area-B](https://en.wikipedia.org/wiki/Private_Use_Areas)(私的領域の一つ)というブロックに属しており、アプリケーションやフォントによって好きな文字を割り当てても良いのですが、互換性のない他のアプリケーションやフォントではその文字は用意されない(または、別の何かになる)ため、文字化けが発生します。ここまではいいでしょうか?
8
+ まず、"\uDBC0\uDC8D"が何かというとこれはサロゲートペアというもので、この二つセットで一つの文字を表しています。JavaScriptでは内部の文字列がUTF-16になっているため、U+10000以上のユニコード文字は必ずサロゲートペアになります。正しく処理されれば**U+10008Dという一つの文字**になります。ただし、この文字は[Supplemental Private Use Area-B](https://en.wikipedia.org/wiki/Private_Use_Areas)(私的領域の一つ)というブロックに属しており、アプリケーションやフォントによって好きな文字を割り当てても良いのですが、互換性のない他のアプリケーションやフォントではその文字は用意されない(または、別の何かになる)ため、文字化けが発生します。ここまではいいでしょうか?
9
9
 
10
- 最初にMySQLへの登録についてです。通常MySQLでユニコード文字列を扱う場合、文字コードとしてutf8またはutf8mb4を使います。デフォルトのまま設定している場合やサイト等を参考にした場合はutf8がほとんどでしょう。しかし、ここに罠があります。このutf8はU+FFFFまでのユニコード文字にしか対応しておらず、U+10000以上の文字は扱えません。絵文字(????など)や一部の異字(????など)が対応していないと言っている場合、MySQLがutf8だったためというのがあります。これを解消するには文字コードをutf8mb4に変更するしかありません。一応、途中で変える手順もあるようですが、私は失敗したことがあるので、最悪DB全てを作り直すことも視野に入れてください。ということで、まずはMySQLの文字コードがutf8mb4になっているかを確認してください。utf8mb4でなければU+10008Dを含め絵文字等も登録できません。
10
+ 最初にMySQLへの登録についてです。通常MySQLでユニコード文字列を扱う場合、文字コードとしてutf8またはutf8mb4を使います。デフォルトのまま設定している場合やサイト等を参考にした場合はutf8がほとんどでしょう。しかし、ここに罠があります。このutf8はU+FFFFまでのユニコード文字にしか対応しておらず、**U+10000以上の文字は扱えません**。絵文字(????など)や一部の異字(????など)が対応していないと言っている場合、MySQLがutf8だったためというのがあります。これを解消するには文字コードをutf8mb4に変更するしかありません。一応、途中で変える手順もあるようですが、私は失敗したことがあるので、最悪DB全てを作り直すことも視野に入れてください。ということで、まずはMySQLの文字コードがutf8mb4になっているかを確認してください。utf8mb4でなければU+10008Dを含め絵文字等も登録できません。
11
11
 
12
12
  次にブラウザ側の文字化けです。MySQLへの登録されうまくいけば、ブラウザまではU+10008Dを渡すことができます。しかし、この文字は私的領域であるため、ブラウザにこの文字を表示するためのグリフ(図形)を持つフォントはありません。方法は二つです。
13
13