Encodingの作用について – プログラミング – Home

通知
すべてクリア

[解決済] Encodingの作用について


おっさん
 おっさん
(@おっさん)
ゲスト
結合: 18年前
投稿: 10
Topic starter  

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);


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> s1を下記の文でバイト列のb1にした場合、b1にはSHIFT-JISに変換され文字列が入るの

> しょうか?

s1は,Unicode符号化文字集合に含まれる文字の並びです。
それをEncodingクラスがShift_JISという文字符号化方式で符号化してバイト列に変換し
た物がb1に代入されます。

> 下記の文(GetString)では、s2のコードは何になるのでしょうか?

Unicode符号化文字集合です。
現実的には,それをUTF-16文字符号化方式で符号化して保持しています。
# サロゲートとかでUTF-16であることを意識しないといけないので。


返信引用
おっさん
 おっさん
(@おっさん)
ゲスト
結合: 18年前
投稿: 10
Topic starter  

ご回答有難うございます。
済みません、再確認になってしまいそうですが・・・

下記のようになると考えていいでしょうか?

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に格納する、ということになりますでしょうか?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> (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に格納する、ということになりますでしょうか?

そうなります。


返信引用
おっさん
 おっさん
(@おっさん)
ゲスト
結合: 18年前
投稿: 10
Topic starter  

レスありがとうございます。

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サービスに漢字文字列を渡す際に、上記のコードを使うのですが、このコードの意味がよく分かりません。
「なぜこんなことをするのか、どんな意味があるのか、こんなことをすると文字列がめちゃくちゃになるのでは???」 と
思ってしまいます。
もし、何かおわかりなら、教えてください。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

当然ながら,文字列はめちゃくちゃになります。
逆順ならまだなんとか説明のしようがあることはあったのですが,
UTF-8 => Shift_JISでは説明のしようがありません。

書いた当人に訊いてみるのが一番だと思います。


返信引用
おっさん
 おっさん
(@おっさん)
ゲスト
結合: 18年前
投稿: 10
Topic starter  

レスありがとうございました。
下記の処理で、文字列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);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました