CID番号から漢字を調べる
CID番号(Adobe-Japan1)から漢字を調べるにはグリフウィキを使うのが簡単。
たとえば、CID 15294 は「顙」だが
https://glyphwiki.org/wiki/aj1-15294
にアクセスすればいい。URLの下5桁がCIDに対応している。CIDが4桁なら先頭にゼロを加えて5桁にする。
カテゴリー:文字コード
文字コード
CID番号(Adobe-Japan1)から漢字を調べるにはグリフウィキを使うのが簡単。
たとえば、CID 15294 は「顙」だが
https://glyphwiki.org/wiki/aj1-15294
にアクセスすればいい。URLの下5桁がCIDに対応している。CIDが4桁なら先頭にゼロを加えて5桁にする。
カテゴリー:文字コード
サクラインターネットのレンタルサーバーをプラン変更したとき、古いデータベースサーバーから新しいデータベースサーバーにデータを移行する必要があった。古いデータを mysqladmin から sql ファイルとしてエクスポートして、新しいデータベースサーバーへはターミナルで接続して source コマンドでエクスポートした。
すると、いくつかあるテーブルの内、後半のテーブル内のデータが文字化けする現象に遭遇した。インポート中のターミナル画面を見ていると気になるエラー?を発見。
--------------------------------------------
Query OK, 870 rows affected (0.02 sec)
Records: 870 Duplicates: 0 Warnings: 0
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Query OK, 850 rows affected (0.02 sec)
Records: 850 Duplicates: 0 Warnings: 0
--------------------------------------------
いったんデータベースサーバーへの接続が切断されて、その後再接続が行われている。そして、その再接続後から文字化けが起こっている?
このエラーは、インポートするデータが大きすぎると起こるらしい。
自分でいじれるサーバーであれば、max_allowed_packet の値を上げることで解決できるようだが(参考)、さくらの自分のプランでは、my.cnf をいじることができないため通用せず。
mysql の文字コードを確認してみる。
//コマンド
-------------------------------
mysql> show variables like "chara%";
-------------------------------
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | ujis |
| character_set_connection | ujis |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | ujis |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
utf8 のデータだが、設定されている文字コードは ujis が多い。文字コードを変更する最も一般的な方法は my.cnf を書き換えることだが自分のプランではできない。ターミナルで mysqlサーバーへログインするときに 文字コードを指定してみる。
//ターミナルで文字コードを設定
-------------------------------
mysql -u ユーザー名 -p -h ホスト名 --default-character-set=utf8
-------------------------------
//設定後
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
character_set_database は use でデータベースを選択すると、データベースの文字コードになる。
//最終的にこうなった
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
この状態で sql ファイルを source で実行したら文字化けは起こらなかった。
カテゴリー:mysql, さくらインターネット, 文字コード
DreamHost にてデータベースの情報を mysql で取り出すと日本語が????と文字化けする。
文字化け対策としてデータベース接続時に文字コードを指定する。
----------------------------------------------------
$link = mysql_connect($hostname,$username,$password);
mysql_select_db($database) or die("Unable to select database");
mysql_query('SET NAMES utf8', $link); ←これを追記
//mysql_set_charset('utf8'); ←もしくはこれ
----------------------------------------------------
SET NAMES には脆弱性あるので mysql_set_charset を使うのがいいよう。
もしくは my.conf で文字コードを指定する。
さくらにて、同じサーバーで異なるドメインを運用中、片一方のドメインだけで文字化けが発生した。文字化け発生箇所は html_entity_decode を実行した直後。
原因はphpのバージョンの違いだった。
html_entity_decode のエンコードのデフォルト値はphpのバージョンで異なる。
PHP 5.6.0 以降では、デフォルト値として default_charset の値が使われる。PHP 5.4 と PHP 5.5 のデフォルト値は、 UTF-8 で、それより前のバージョンの PHP のデフォルト値は ISO-8859-1 である。
私のさくらサーバーはhtmlファイル内でphpを実行させるため、ルートファイルにphp.cgiをコピーしている。で、さくらのphpのバージョンはコピーしたphp.cgiで決まる。今回片一方のドメインのみで文字化けが起こったのはphp.cgiのバージョンが異なったためだった。
文字化けなしのphp.cgiをコピーして問題は解決した。なお、html_entity_decode では encoding というオプションの引数で文字コードを変えることが可能である。
UTF-8なら、
html_entity_decode($str,ENT_NOQUOTES,'UTF-8')
カテゴリー:さくらインターネット, 文字コード
文字参照をそのまま表示するには頭文字の「&」を文字参照に置き換える。
つまりダブルクォーテーションの文字参照「"」なら、「"」、
大なり記号の文字参照「<」なら、「&lt;」と記述すればいい。
カテゴリー:文字コード
たまに目にするUJISという文字コード。気になったので調べました。
内容的には、日本語EUC(EUC-JP)のこと。
シグマOSの日本語コード系で、UNIX化拡張JIS(Unixnized extended JIS)コードの略。
国際的なUNIX コード体系(EUC:Extended UNIX Codes)の枠組みに従って日本語のコード体系を組み込んだもの。
※シグマOSとは、Σ(シグマ)プロジェクトで作られたオペレーティング・ システム。
カテゴリー:文字コード