@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

C#とPHP4での文字コードから文字を取得する動きについて

1
投稿者投稿内容
YASU
会議室デビュー日: 2003/10/27
投稿数: 9
投稿日時: 2006-02-03 18:59
お世話になります。

ある文字列から1文字ずつ文字コードを取得し、ビットを左シフトさせたものをまた文字に変換する処理
を行なうというあるプログラムがPHPであり、それとまったく同じ動きをC#で実現させたいと思っております。

"eV9zaGlub"という文字列のビット演算した結果を取得する以下のようなプログラムを書いたのです
が、出力される文字列がそれぞれで異なってしまいます。
 PHP:「ハャr・借・」
 C# :「ハャrツリト」

ビット演算した数値から文字を取得する使用がPHPとC#では異なるのでは?と思っているのですが、
なにかお分かりになる事がありましたらよろしくお願い致します。


【PHP】
$strA = "eV9zaGlub";
$strOutput = "";
for ($i=0; $i<strlen($strA); $i++)
{
$strOutput = $strOutput . chr(ord($strA{$i})<<1);
}

//$strOutput = ハャr・借・

【C#】
string strA = "eV9zaGlub";

byte[] bStr = Encoding.ASCII.GetBytes(strA);
StringBuilder sb = new StringBuilder();

int shift_data = -1;

foreach (byte b in bStr)
{
 shift_data = int.Parse(b.ToString()) << 1;

 byte[] shift_code = { byte.Parse(shift_data.ToString()) };
 char[] shift_char = Encoding.Default.GetChars(shift_code);
 sb.Append(shift_char);
}

string strOutput = sb.toString();

//strOutput = ハャrツリト
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-02-03 19:18
コード:
string strA = "eV9zaGlub"; 

byte[] bStr = Encoding.GetEncoding("Shift_JIS").GetBytes(strA); 
StringBuilder sb = new StringBuilder(); 

int shift_data = -1; 

ArrayList shift_code = new ArrayList();

foreach (byte b in bStr) 
{ 
	shift_data = int.Parse(b.ToString()) << 1; 
	shift_code.Add(byte.Parse(shift_data.ToString()));
} 

char[] shift_char = Encoding.GetEncoding("Shift_JIS").GetChars((byte[])shift_code.ToArray(typeof(byte)));
sb.Append(shift_char); 

string strOutput = sb.ToString(); 


とりあえず、こうしたら PHP の方と同じ結果になりました。
_________________
囚人のジレンマな日々
YASU
会議室デビュー日: 2003/10/27
投稿数: 9
投稿日時: 2006-02-03 19:39
囚人さん

教えていただいた方法で試したところ、PHPと同じ値で出力されました!
ありがとうございます!

foreach文の中で文字に変換かけていたのがいけなかったんですね。

[ メッセージ編集済み 編集者: やす 編集日時 2006-02-03 19:46 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-02-03 19:54
引用:

foreach文の中で文字に変換かけていたのがいけなかったんですね。


PHP を知らないので PHP の方の処理がどうなっているのか分からないのですが、結果に漢字が出力されているので、2バイト必要な箇所があります。(Shift_JIS と決めうちした。)
1バイトずつの変換では駄目だったって事ですね。

#ちなみに byte と int の変換で、一度文字列にするのはあまりよろしくないかな。

_________________
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2006-02-03 19:55 ]
YASU
会議室デビュー日: 2003/10/27
投稿数: 9
投稿日時: 2006-02-03 19:56
なるほど。
とても参考になりました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)