Open Source WEB

16進数表記だけでは、キャラクタセットはbinaryになる

16進数表記から文字列を作るで16進数から文字列を作る方法を示した。 でも、これで充分なのだろうか。

たとえば、 0xE1E1 は、ujisならば 瘁 であるが、sjis ならば 矣 である。 つまり、16進数を並べただけでは漢字までは決まらない。 どのキャラクタセットを意味しているのかを示す必要がある。

指定が今までは抜けていたので、 そのときには、どのキャラクタセットになる訳でもなく、 binaryというものになる。キャラクタセットの中には、 実はbinaryというのが用意されているのであった。

使用可能なキャラクタセットの中で、全ての使用可能なキャラクタセットを 示しているが、下から2番目にちゃんとbinaryが存在する。

binaryのままでも動くように書けないことはないが、 きっちり指定したいものである。 もちろん、時には binary の方が都合が良い場合もある。

binaryはとても重要な考えなので、そのうちきちんと説明しようと 思うが、どうなるかは不明。まだ、どこで説明するか考えてもいないのである。


キャラクタセット指定前置子 introducer

そのために、introducer というのが用意されている。 introducer を英辞郎で調べたら 輸入業者 なる訳が出て来たが、 これではなんのことかさっぱり分らないだろう。 introduce という動詞が 紹介するとか、案内するという意味をもち、 ここではそういう類のことをするモノとして使われている。 実際には、C言語などのキャストに近いのではないかと思う。

使い方は、16進数表記された文字列の直前に、キャラクタセット名の直前に _(アンダースコア)がついたものを 置くことで、16進数表示の文字列を、指定したキャラクタセットの 文字列として扱うのである。 ごちゃごちゃ説明するより、サンプルの方が分りやすいだろう。 前回、'漢字表示'という文字列を16進数表記で与えるテストとして、

mysql> SELECT x'B4C1BBFAC9BDBCA8';
+---------------------+
| x'B4C1BBFAC9BDBCA8' |
+---------------------+
| 漢字表示            |
+---------------------+
1 row in set (0.00 sec)

を示したが、これはサーバ側で16進数から文字列に直すときに偶然 ujisになっていたので、動いたのである。 つまり、 SET NAMES ujis などにより、適当な状態になっていただけのことである。

キャラクタ端末がSHIFT-JISになり、SET NAMES sjis により、 sjisの環境になったところで、ujisの文字列の16進数表記を 与えるとどうなるであろうか。

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

mysql> SELECT x'B4C1BBFAC9BDBCA8';
+---------------------+
| x'B4C1BBFAC9BDBCA8' |
+---------------------+
| エチサ?ノスシィ            |
+---------------------+
1 row in set (0.00 sec)

この場合、与えられたバイト列を、無理矢理sjisと解釈するので、 半角カタカナがいっぱいの意味不明な文字列になる。


ここで、introducer _ujis を付け加えてみよう。

mysql> SELECT _ujis x'B4C1BBFAC9BDBCA8';
+----------+
| 漢字表示 |
+----------+
| 漢字表示 |
+----------+
1 row in set (0.00 sec)

現在、キャラクタセット関連のシステム変数は

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

となっており、どこにも ujis はない。 それでも、introducerを前に置くことで、指定のキャラクタセットと みなすことができる。 つまり、ujisからsjisに変換すべき個所でちゃんとコード変換が行なわれ、 mysqlの表示もちゃんとなったのである。

introducer 16進数表記

_ujis x'B4C1BBFAC9BDBCA8'

_ujis 0xB4C1BBFAC9BDBCA8


戻る:16進数表記から文字列を作る

次へ:普通の文字列にもintroducerを付加できる


フィードバック:

Name:
Comment:

There is no comment.

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

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