[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 メーリングリストの案内