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

バイト文字列とユニコードの変換

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-29 14:23
VB6 では、

コード:

Dim 変換前 as string: 変換前 = "バイト文字列とユニコードの変換ってどうやってやるんだろう?"
Dim バイト配列() As Byte: バイト配列 = StrConv(変換前, vbFromUnicode)
dim 変換後 as string: 変換後 = StrConv(バイト配列, vbUnicode)



ですが、.net で同等のことをするのは、

コード:

Dim 変換前 as string = "バイト文字列とユニコードの変換ってどうやってやるんだろう?"
Dim バイト配列() As Byte = System.Text.UnicodeEncoding.Unicode.GetBytes(変換前)
dim 変換後 as string = System.Text.UnicodeEncoding.Unicode.GetString(バイト配列)



これでは駄目なんでしょうか?
文字が化けるんですが・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-29 14:39
引用:

R・田中一郎さんの書き込み (2005-12-29 14:23) より:

これでは駄目なんでしょうか?
文字が化けるんですが・・・


化けませんでしたよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-29 14:47
引用:


じゃんぬねっとさんの書き込み (2005-12-29 14:39) より:

化けませんでしたよ。



サンプルを実行すると、元の文字列が表示されるので化けませんが、strconv で作成したバイト配列データを、System.Text.UnicodeEncoding.Unicode.GetString すると化けたのです。
このことから、

StrConv(変換前, vbFromUnicode)

System.Text.UnicodeEncoding.Unicode.GetBytes(変換前)

更に、

StrConv(バイト配列, vbUnicode)

System.Text.UnicodeEncoding.Unicode.GetString(バイト配列)

は違う結果を返すのかと思ったのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-29 15:03
引用:

R・田中一郎さんの書き込み (2005-12-29 14:47) より:

strconv で作成したバイト配列データを、System.Text.UnicodeEncoding.Unicode.GetString すると化けたのです。


vbFromUnicode したものですからね。
そりゃ化けますよ。(^^;)
System.Text.Encoding.Default.GetString だとどうなりますか?

そもそも、System.Text.UnicodeEncoding.Unicode というのは冗長ですよ。
Unicode プロパティは基底クラスである Encoding クラスの所有物です。

ですので、
 System.Text.Encoding.Unicode.GetString()
とするか、
 New System.Text.UnicodeEncoding().GetString()
とするのが適切です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-29 15:19
引用:


じゃんぬねっとさんの書き込み (2005-12-29 15:03) より:

vbFromUnicode したものですからね。
そりゃ化けますよ。(^^



(T人T)神様...

引用:


じゃんぬねっとさんの書き込み (2005-12-29 15:03) より:

System.Text.Encoding.Default.GetString だとどうなりますか?




文字化けした文字は表示されなくなりましたが、先頭のANK1文字のみが正常に変換されたのみで後は空白(何やらデータが入っているが変換後の文字が空白)になりました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-29 15:37
引用:

R・田中一郎さんの書き込み (2005-12-29 15:19) より:

文字化けした文字は表示されなくなりましたが、先頭のANK1文字のみが正常に変換されたのみで後は空白(何やらデータが入っているが変換後の文字が空白)になりました。


そういう場合は、Byte の中身を比較してみましょう。
私はこうなりました。

コード:

[VB6 - ソース]

    Dim stSource As String
    stSource = "バイト文字列とユニコードの変換ってどうやってやるんだろう?"

    Dim btBytes() As Byte
    btBytes() = StrConv(stSource, vbFromUnicode)

    Dim i As Integer
    For i = LBound(btBytes()) To UBound(btBytes())
        Debug.Print CStr(btBytes(i))
    Next i

[VB6 - 結果]

    131, 111, 131,  67, 131, 103, 149, 182, 142, 154,
    151, 241, 130, 198, 131, 134, 131, 106, 131,  82,
    129,  91, 131, 104, 130, 204, 149, 207, 138, 183,
    130, 193, 130, 196, 130, 199, 130, 164, 130, 226,
    130, 193, 130, 196, 130, 226, 130, 233, 130, 241,
    130, 190, 130, 235, 130, 164, 129,  72

コード:

[VB7.1 (2003) - ソース]

    Dim stSource As String = ( _
        "バイト文字列とユニコードの変換ってどうやってやるんだろう?" _
    )

    Dim btBytes As Byte() = System.Text.Encoding.Default.GetBytes(stSource)

    For Each bt As Byte In btBytes
        Console.WriteLine(bt.ToString())
    Next bt

[VB7.1 (2003) - 結果]

    131, 111, 131,  67, 131, 103, 149, 182, 142, 154,
    151, 241, 130, 198, 131, 134, 131, 106, 131,  82,
    129,  91, 131, 104, 130, 204, 149, 207, 138, 183,
    130, 193, 130, 196, 130, 199, 130, 164, 130, 226,
    130, 193, 130, 196, 130, 226, 130, 233, 130, 241,
    130, 190, 130, 235, 130, 164, 129,  72


正しいものが渡っているのであれば、正しく変換されるハズですよ。( ̄- ̄;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2005-12-29 18:22
引用:

じゃんぬねっとさんの書き込み (2005-12-29 15:37) より:

そういう場合は、Byte の中身を比較してみましょう。
私はこうなりました。




教えていただいた方法でテストしてみたところ、途中まで同じで、途中から違う内容になっていました。
この部分を修正したところ解決しました。

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

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