DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SJIS<->UTF8の文字コード変換

環境/言語:[Windows XP VB.NET2010 ]
分類:[.NET]

初めて投稿します。godo-tysと申します。
先に、本投稿はマルチポストであることをお断りします。
ポスト先:http://oshiete.goo.ne.jp/qa/7797421.html

やりたいことは、
SJISの文字列をUTF8文字列に変換して、TextBox1に表示する。
TextBox1をUTF文字列をSJIS文字列に戻す。

作成したコード
Dim beforeStr As String = "変換前"
Dim utfEnc = System.Text.Encoding.GetEncoding(65001)
Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr)
Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes)
Dim afterStr As String = sjisEnc.GetString(afterBytes)
TextBox3.Text = afterStr 'UTF8文字列

Dim reverseStr As String = afterStr
Dim reverseBytes() As Byte = sjisEnc.GetBytes(reverseStr)
Dim baseBytes() As Byte = System.Text.Encoding.Convert(utfEnc, sjisEnc, reverseBytes)
TextBox4.Text = utfEnc.GetString(baseBytes) 'SJIS文字列

としましたが、UTF8文字列が「陞溽判驪、陷代・」となり、
逆変換したSJIS文字列は、「変換&#65533;?E」となり、変換がうまくいかないようです。

上記のコードでは、SJIS->UTF8の変換はまずいのでしょうか?
それとも、そもそもおかしな事をやっているのでしょうか?

お知恵を拝借でいればと思います。

よろしくお願いいたします。
■No31110に返信(godo-tysさんの記事)

> やりたいことは、
> SJISの文字列をUTF8文字列に変換して、TextBox1に表示する。
> TextBox1をUTF文字列をSJIS文字列に戻す。
SJISであろうとUTF8であろうと表示上の文字列は変わりません。
ただSJISコードで表現出来ない文字でもUTF8コード上では
表現できるものはあります。文字列としてShiftJISの文字列とかUTF8の文字列とかはなく文字列はUTF16になったと思います。


>
> 作成したコード
> Dim beforeStr As String = "変換前"
> Dim utfEnc = System.Text.Encoding.GetEncoding(65001)
> Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Encodingの取得はこれで良いかと思います。


> Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr)
UTF8のコード取得はこれで良いです。

> Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes)
第1引数が元のエンコーディング、第2引数が変換後のエンコーディングなので
逆です。

後の処理は問題ないかと思います。


> 上記のコードでは、SJIS->UTF8の変換はまずいのでしょうか?
> それとも、そもそもおかしな事をやっているのでしょうか?
>
Encoding.GetBytesは内部表現の文字列から該当するエンコーディングの
byte配列を返すので
utfEnc.GetBytes()
sjisEnc.GetBytes()
でbyte配列を取得すればよく
byte配列から文字列を取得するにはEncodingでGetStringすればよく
byte配列を別のエンコードのbyte配列にするときにConvertをすればよく
これらを組み合わせて1つの処理をする必要はないです。

最初に書いたようにShitJIS文字列からUTF8文字列に変換するという処理は
意味がなく厳密には無理です。
■No31111に返信(shuさんの記事)
> ■No31110に返信(godo-tysさんの記事)
>
>>やりたいことは、
>>SJISの文字列をUTF8文字列に変換して、TextBox1に表示する。
>>TextBox1をUTF文字列をSJIS文字列に戻す。
> SJISであろうとUTF8であろうと表示上の文字列は変わりません。
> ただSJISコードで表現出来ない文字でもUTF8コード上では
> 表現できるものはあります。文字列としてShiftJISの文字列とかUTF8の文字列とかはなく文字列はUTF16になったと思います。
>
>
>>
>>作成したコード
>> Dim beforeStr As String = "変換前"
>> Dim utfEnc = System.Text.Encoding.GetEncoding(65001)
>> Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
> Encodingの取得はこれで良いかと思います。
>
>
>> Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr)
> UTF8のコード取得はこれで良いです。
>
>> Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes)
> 第1引数が元のエンコーディング、第2引数が変換後のエンコーディングなので
> 逆です。
>
> 後の処理は問題ないかと思います。

引数の確認は忘れてました。

>
>
>>上記のコードでは、SJIS->UTF8の変換はまずいのでしょうか?
>>それとも、そもそもおかしな事をやっているのでしょうか?
>>
> Encoding.GetBytesは内部表現の文字列から該当するエンコーディングの
> byte配列を返すので
> utfEnc.GetBytes()
> sjisEnc.GetBytes()
> でbyte配列を取得すればよく
> byte配列から文字列を取得するにはEncodingでGetStringすればよく
> byte配列を別のエンコードのbyte配列にするときにConvertをすればよく
> これらを組み合わせて1つの処理をする必要はないです。
>
> 最初に書いたようにShitJIS文字列からUTF8文字列に変換するという処理は
> 意味がなく厳密には無理です。

ありがとうございます。 意味ないことを考えていたようです。

マルチポスト先のhttp://oshiete.goo.ne.jp/qa/7797421.htmlで教えていただき
か行けるすることができました。

最終的には、

Dim beforeStr As String = "変換前"

'こちらの部分は、もっと簡単な表現があるかもしれません。------
If (beforeStr.Length Mod 2) <> 0 Then
beforeStr = beforeStr & " " '文字数が奇数の時は空白文字を付けたす
End If
'----------------------------------

Dim utfEnc = System.Text.Encoding.UTF8
Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Dim afterBytes() As Byte = sjisEnc.GetBytes(beforeStr)
Dim afterStr As String = sjisEnc.GetString(afterBytes)

Dim reverseBytes() As Byte = utfEnc.GetBytes(afterStr)
TextBox3.Text = sjisEnc.GetString(reverseBytes)
TextBox4.Text = utfEnc.GetString(reverseBytes).Trim()

で私の意図する処理ができました。

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

DOBON.NET | プログラミング道 | プログラミング掲示板