[PHP-users 35072] Re: 文字変換のにコードについて
shige02 @ mac.com
shige02 @ mac.com
2010年 3月 30日 (火) 16:08:16 JST
重松です。
7bit 以下にしたいなら、自分なら迷わず base64 を使いますけど。
http://php.net/manual/ja/function.base64-encode.php
ちなみに、base64 は 6bit で半端がでたら = なんかで埋めるので、大体、1.4 倍程度に膨れますけど、倍になるよりは随分マシですし、SJIS や EUC を UTF-8 に変えると、日本語の場合大体 1.5 倍に膨れるので、まあ似たようなもんではないかと思います。
けど、今どき SJIS で開発する理由が知りたいですね。
そんなことをしたら、国際化で困るだけでしょうし、メモリハードディスクも湯水のように使っても、タダみたいな値段でリソースを追加できる。
あと、大きなお世話かもしれませんが、自分でコードを書かないほうがいいですよ。
自分で書いたコードは自分で直さないと行けませんが、他人が書いたコードは他人が直す可能性があります。
無論、他人のコードにバグがあれば、自分で直せるわけだから、こういうありふれた処理を自分で書く意味は何もない。
たとえば、PHP には、以下のようなこういう処理をする関数があります。
bin2hex http://jp.php.net/manual/ja/function.bin2hex.php
pack http://jp.php.net/manual/ja/function.pack.php
もちろん、printf でも、printf("%02x", $hexvalue) のようにできます。
殆ど意味がありませんけど、dechex なんかもありますね。
> sjisで文字を扱った場合、文字化けが生じた関係で、日本語(sjis)を、16進のコー
> ドの
> 文字に置き換えて、データに保存し、再現する場合は、16進を文字コードに戻して
> います。
>
> たとえば、文字からhexにする場合は、
> kaisya会社123重厚重工業 → 6b616973796189ef8ed03132338f648cfa8f648d488bc6
>
> hexから文字に戻す場合は、
> 6b616973796189ef8ed03132338f648cfa8f648d488bc6 → kaisya会社123重厚重工業
> です。
>
> phpでは、スマートな記述が出来ると思うのですが、どなたか、ご教示いただきたい
> のですが。
>
> 色々調べて、
> unserialize(s)・・・hexから文字コードに使える?
> str_replace($f,$t,$s)・・・・文字からhexの変換につかえる?
> を探したのですが、どのように使えばよいかを、ご指導ください。
>
> 関数は、http://d.hatena.ne.jp/hetima/20061025/1161773698 を
> 参考にしました。
>
> 宜しくお願いします。
>
> PHPは、5.2.13です。
>
> 現在のコードは、以下です。
>
> <?php
>
> /*
> * 変換サンプル
> * 文字→hex
> * kaisya会社123重厚重工業 → 6b616973796189ef8ed03132338f648cfa8f648d488bc6
> * hex→文字
> * 6b616973796189ef8ed03132338f648cfa8f648d488bc6 → kaisya会社123重厚重工業
> *
> */
>
> #========= STRING to HEX ==============
> function str2hex($string)
> {
> $ret="";
> $string=trim($string);
>
> for($i=0;$i<strlen($string);$i++){
> $ret .= sprintf('%02x',ord(substr($string,$i,1)));
> }
>
> return $ret;
>
> }
> //---------------------------------------------------------------------
> #====== HEX to STRING============
> function hex2str($string)
> {
> $ret='';
> $string=strtolower(trim($string));
>
> for($i=0;$i<strlen($string);$i=$i+2){
> if(substr($string,$i,1)=='0') $a=0x00; #←ここからの分をス
> マートにしたいのですが
> elseif(substr($string,$i,1)=='1') $a=0x10; #
> elseif(substr($string,$i,1)=='2') $a=0x20;
> elseif(substr($string,$i,1)=='3') $a=0x30;
> elseif(substr($string,$i,1)=='4') $a=0x40;
> elseif(substr($string,$i,1)=='5') $a=0x50;
> elseif(substr($string,$i,1)=='6') $a=0x60;
> elseif(substr($string,$i,1)=='7') $a=0x70;
> elseif(substr($string,$i,1)=='8') $a=0x80;
> elseif(substr($string,$i,1)=='9') $a=0x90;
> elseif(substr($string,$i,1)=='a') $a=0xa0;
> elseif(substr($string,$i,1)=='b') $a=0xb0;
> elseif(substr($string,$i,1)=='c') $a=0xc0;
> elseif(substr($string,$i,1)=='d') $a=0xd0;
> elseif(substr($string,$i,1)=='e') $a=0xe0;
> elseif(substr($string,$i,1)=='f') $a=0xf0;
>
> if(substr($string,$i+1,1)=='0') $b=0x00;
> elseif(substr($string,$i+1,1)=='1') $b=0x01;
> elseif(substr($string,$i+1,1)=='2') $b=0x02;
> elseif(substr($string,$i+1,1)=='3') $b=0x03;
> elseif(substr($string,$i+1,1)=='4') $b=0x04;
> elseif(substr($string,$i+1,1)=='5') $b=0x05;
> elseif(substr($string,$i+1,1)=='6') $b=0x06;
> elseif(substr($string,$i+1,1)=='7') $b=0x07;
> elseif(substr($string,$i+1,1)=='8') $b=0x08;
> elseif(substr($string,$i+1,1)=='9') $b=0x09;
> elseif(substr($string,$i+1,1)=='a') $b=0x0a;
> elseif(substr($string,$i+1,1)=='b') $b=0x0b;
> elseif(substr($string,$i+1,1)=='c') $b=0x0c;
> elseif(substr($string,$i+1,1)=='d') $b=0x0d;
> elseif(substr($string,$i+1,1)=='e') $b=0x0e;
> elseif(substr($string,$i+1,1)=='f') $b=0x0f;
>
> $ret .= chr($a|$b);
>
> }
>
> return $ret;
> }
>
> #=====デバッグライト(検証)========
> $moji = "kaisya会社123重厚重工業";
> $result = str2hex($moji);
>
> $hexmoji = $result;
> $result2 = hex2str($hexmoji);
> echo $moji;
> echo " → ";
> echo $result;
> echo "<br>";
> echo $hexmoji;
> echo " → ";
> echo $result2;
> ?>
>
--
Osamu Shigematsu
PHP-users メーリングリストの案内