Open Source WEB

気を取り直して、前回の続きをやってみよう。


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

端末の文字コードを Shift-JIS にしてある。

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

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

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

さて、'\\'が \ となってしまったのであったから、 今度は '\' を試してみよう。

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

次は、HEX()を使ってみよう。

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

全角の\が5Cになっている。つまり、サーバに渡って関数HEX()の引数 として与えられた文字列は、全角ではなく、半角、1バイトの5Cであったのだ。

ということは、この状態だと、全角の\も半角の\も同じエスケープ文字として 利用できそうだ。

mysql> SELECT '\\', '\\', HEX('\\'), HEX('\\');
+----+------+-------------+-------------+
| \ | \\ | HEX('\\') | HEX('\\') |
+----+------+-------------+-------------+
| \ | \\ | 5C          | 5C5C        |
+----+------+-------------+-------------+

\もエスケープとして使えるかと思ったらダメだった。 しかし、\と\は最終的には、\と表示されるみたいだ。

ますます混乱してきたな。


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

どうも、サーバとクライアントの間で、変な変換というか、 ありがた迷惑な自動変換が行なわれているようだ。

この自動変換は、最初クライアントからサーバへ行くときと、 結果をサーバからクライアントに戻すときの2回発生するので、 なかなかややこしいのである。

2回も変換が発生するのではよく分らないので、サーバからクライアントに 戻すときの変換についてのみ考えよう。 とは書いたものの、どうすればそれを調べられるのだろうか。 サーバに自分の思っている通りの文字列データおよびキャラクタセットを 指定できないと実験ができない。

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

サーバ側は ujis なので、 \ は 815F で与えなければならない。

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

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

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

mysql> SET NAMES ujis;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SET character_set_connection=sjis;
Query OK, 0 rows affected (0.01 sec)
 
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | ujis   |
| character_set_connection | sjis   |
| character_set_database   | latin1 |
| character_set_results    | ujis   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
6 rows in set (0.00 sec)

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

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

0x5C に対する表示の \ は、端末がUJISなので半角の¥マークではなく、 半角のバックスラッシュになっている。 (もし今見ている画面がそうでなくても、そう思ってくれ。 端末の画面をキャプチャーして張りつければ一番いいのだが、面倒なのだ)

もうちょっと調べてみよう。

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

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

今度は、前の逆で、 '\' という全角の逆スラッシュが、 表示されるときには 半角の '\' になっている。

ということは、SJIS と UJIS という2つのキャラクタセットの間の 自動変換が行なわれるとき、\ および \ が 勝手に変ったりするようである。 ありがた迷惑な話である。


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

次へ:バックスラッシュ(\,5C)が文字化けする(続々編)


フィードバック:

Name:
Comment:

There is no comment.

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

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