Encodingの作用について、どなたか教えてください。
「GetEncoding(shift-jis).GetBytes(s)」の解説に、よく「shift-jisとしてバイト列
に変換する」などと書いてありますが、「shift-jisとして変換する」とはどういう意味
なのでしょうか? もとのstring sをshift-jisとみなすのか、それとも変換後のバイト
列をshift-jisにするのでしょうか?
また、「GetString(b)」の場合にはどうなるのでしょうか?
s1を下記の文でバイト列のb1にした場合、b1にはSHIFT-JISに変換され文字列が入るので
しょうか?
string s1=textBox1.text;
byte[] b1 = System.Text.Encoding.GetEncoding(shift-jis).GetBytes(s1);
下記の文(GetString)では、s2のコードは何になるのでしょうか?
string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
たとえば、下記の文は、どのような変換を行うことになるのでしょうか?
string s1 = textBox1.Text;
byte[] b1 = System.Text.Encoding.GetEncoding(utf-8).GetBytes(s1);
string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
> s1を下記の文でバイト列のb1にした場合、b1にはSHIFT-JISに変換され文字列が入るの
で
> しょうか?
s1は,Unicode符号化文字集合に含まれる文字の並びです。
それをEncodingクラスがShift_JISという文字符号化方式で符号化してバイト列に変換し
た物がb1に代入されます。
> 下記の文(GetString)では、s2のコードは何になるのでしょうか?
Unicode符号化文字集合です。
現実的には,それをUTF-16文字符号化方式で符号化して保持しています。
# サロゲートとかでUTF-16であることを意識しないといけないので。
ご回答有難うございます。
済みません、再確認になってしまいそうですが・・・
下記のようになると考えていいでしょうか?
string s1=textBox1.text;
(1) byte[] b1 = System.Text.Encoding.GetEncoding(shift-jis).GetBytes(s1); は、Unicodeの文字列s1を
Shift-JISコードに変換してバイト列b1に格納する。
(2) string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1); は、バイト列b1をShift-JISであ
るとみなして、それをUnicodeに変換して文字列s2に格納する。これは(1)とは違った作用になりますね?
上が正しいとすると・・・
string s1 = textBox1.Text;
(1) byte[] b1 = System.Text.Encoding.GetEncoding(utf-8).GetBytes(s1);
(2) string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
は、(1) s1をUTF-8に変換してバイト列b1に格納する。(2) その後、バイト列b1を(本当はUTF-8なのだけれど)Shift-
JISとみなして、それをUnicodeに変換して文字列s2に格納する、ということになりますでしょうか?
> (1) byte[] b1 = System.Text.Encoding.GetEncoding(shift-jis).GetBytes(s1);
> (2) string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
> これは(1)とは違った作用になりますね?
違った作用というか,GetBytesとGetStringは逆関数の関係になります。
# 正確には完全な逆関数ではないですが…… (\u00C0をAにしたりするので)。
> (1) s1をUTF-8に変換してバイト列b1に格納する。
> (2) その後、バイト列b1を(本当はUTF-8なのだけれど)Shift-JISとみなして、
> それをUnicodeに変換して文字列s2に格納する、ということになりますでしょうか?
そうなります。
レスありがとうございます。
GetBytesとGetStringは、昔のFortranなどで使っていたEncode、Decodeの関係のようですね。
でも、逆関数だけれど、元に戻らないものもあり得る? という感じなのでしょうか?
済みません、さらにお尋ねしてしまいますが、下記のコードの意味って、何かおわかりでないでしょうか?
string s1 = textBox1.Text;
(1) byte[] b1 = System.Text.Encoding.GetEncoding(utf-8).GetBytes(s1);
(2) string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
(1) s1をUTF-8に変換してバイト列b1に格納する。
(2) バイト列b1を(本当は中身はUTF-8なのだけれど) Shift-JISとみなして、それをUnicodeに変換してs2に格納する。
あるWebサービスに漢字文字列を渡す際に、上記のコードを使うのですが、このコードの意味がよく分かりません。
「なぜこんなことをするのか、どんな意味があるのか、こんなことをすると文字列がめちゃくちゃになるのでは???」 と
思ってしまいます。
もし、何かおわかりなら、教えてください。
当然ながら,文字列はめちゃくちゃになります。
逆順ならまだなんとか説明のしようがあることはあったのですが,
UTF-8 => Shift_JISでは説明のしようがありません。
書いた当人に訊いてみるのが一番だと思います。
レスありがとうございました。
下記の処理で、文字列sとs1が同じであることも、いくつかの文字列で確認しました。
(1) byte[] b1 = System.Text.Encoding.GetEncoding(utf-8).GetBytes(s);
(2) string s1 = System.Text.Encoding.GetEncoding(utf-8).GetString(b1);
(1) byte[] b1 = System.Text.Encoding.GetEncoding(shift-jis).GetBytes(s);
(2) string s1 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);
一方、下記の意味はいまだ不明ですが、とりあえず、本件クローズいたします。
(1) byte[] b1 = System.Text.Encoding.GetEncoding(utf-8).GetBytes(s1);
(2) string s2 = System.Text.Encoding.GetEncoding(shift-jis).GetString(b1);