Open Source WEB

sjisの代わりにcp932、ujisの代わりにeucjpmsを使ったら、 いままで起きていた文字化けは直るのだろうか? 今回をそれをチェックしてみよう。

テストをきちんと行なうのは面倒なので、 バックスラッシュ(\,5C)が文字化けする で行なったことを、新しいキャラクタセットに置き換えて逐次試すことにしよう。 (これなら、頭を使わなくて済む!)


比較対象:バックスラッシュ(\,5C)が文字化けする


サーバ側(sjis) - - - - クライアント側(sjis)

端末の文字コードを Shift-JIS にして、以下を行なってみた。

mysql> SET NAMES cp932;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT '\\';
+---+
| \ |
+---+
| \ |
+---+
1 row in set (0.03 sec)

大丈夫そうなので、次!

mysql> SELECT HEX('\\');
+-----------+
| HEX('\\') |
+-----------+
| 5C        |
+-----------+
1 row in set (0.08 sec)
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | cp932  |
| character_set_connection | cp932  |
| character_set_database   | latin1 |
| character_set_results    | cp932  |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.00 sec)

なんら問題なし。


サーバ側(ujis) - - - - クライアント側(sjis)

コネクションキャラクタセットだけを ujis ではなく、 新キャラクタセットの eucjpms にする。

mysql> SET character_set_connection=eucjpms;
Query OK, 0 rows affected (0.03 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | cp932   |
| character_set_connection | eucjpms |
| character_set_database   | latin1  |
| character_set_results    | cp932   |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.00 sec)
mysql> SELECT '\\';
+---+
| \ |
+---+
| \ |
+---+
1 row in set (0.00 sec)

これでも、全角の\になったりすることはない。


比較対象:バックスラッシュ(\,5C)が文字化けする(続編)


サーバ側(ujis) - - - - クライアント側(sjis)

端末の文字コードは変更していないので、Shift-JIS のままである。

mysql> SET NAMES cp932;
Query OK, 0 rows affected (0.00 sec)

mysql> SET character_set_connection=eucjpms;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | cp932   |
| character_set_connection | eucjpms |
| character_set_database   | latin1  |
| character_set_results    | cp932   |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.01 sec)
mysql> SELECT '\';
+----+
| \ |
+----+
| \ |
+----+
1 row in set (0.03 sec)

\は\となったのでOK。 前は \ が \ になってしまったのであった。

mysql> SELECT HEX('\');
+-----------+
| HEX('\') |
+-----------+
| A1C0      |
+-----------+
1 row in set (0.00 sec)

これは、\の EUC-JP のコードでありOK。

mysql> SELECT '\\', '\\', HEX('\\'), HEX('\\');
+---+------+-----------+-------------+
| \ | \\ | HEX('\\') | HEX('\\') |
+---+------+-----------+-------------+
| \ | \\ | 5C        | A1C0A1C0    |
+---+------+-----------+-------------+
1 row in set (0.00 sec)

これが、以前はメタメタになったのであった。


サーバに直接16進数表記で文字列を与えてみよう

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | cp932   |
| character_set_connection | eucjpms |
| character_set_database   | latin1  |
| character_set_results    | cp932   |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.00 sec)

サーバ側はeucjpms、つまりEUC-JPなので、\ は 815F で与えなければならない。

mysql> SELECT 0x5C, 0x815F;
+------+--------+
| 0x5C | 0x815F |
+------+--------+
| \    | \     |
+------+--------+
1 row in set (0.00 sec)

サーバ側(cp932) - - - - クライアント側(eucjpms)

次に、逆をやってみよう。 つまり、端末のキャラクタセットをEUC-JPにして、以下のように設定する。

mysql> SET NAMES eucjpms;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | eucjpms |
| character_set_connection | cp932   |
| character_set_database   | latin1  |
| character_set_results    | eucjpms |
| character_set_server     | latin1  |
| character_set_system     | utf8    |
+--------------------------+---------+
6 rows in set (0.00 sec)

今度は、サーバ側がcp932(SJIS)なので、16進数で与える\ は A1C0 になる。

mysql> SELECT 0x5C, 0xA1C0;
+------+--------+
| 0x5C | 0xA1C0 |
+------+--------+
| \    | \     |
+------+--------+
1 row in set (0.08 sec)
mysql> SELECT HEX('\\');
+-----------+
| HEX('\\') |
+-----------+
| 5C        |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT HEX('\');
+-----------+
| HEX('\') |
+-----------+
| 815F      |
+-----------+
1 row in set (0.00 sec)

2回ぶんも調べたが、問題は全然発生しないようだ。


戻る:新キャラクタセットcp932,eucjpmsとは何か

次へ:全角のバックスラッシュ(\) はどう変換されるか


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us