• ベストアンサー

VB2008EE でS-JISでエンコードできない

お世話になります。 VB初心者でシリアル通信(RS232C)を作っております。 送受信は出来るようになったのですが、全角文字が送信・受信共に文字化けします。 英数字が正常に通信できることからエンコードが「UTF-8」になっていると思われますが、これを「S-JIS」に変更する方法がわかりません。インターネットでも色々調べているのですがVB2008は内部コードがUTF-8になっているみたいです。 送信する文字と受信する文字をS-JISでエンコードしたいのですが定義方法とかご存知の方がいましら教えていただければと思います。 今までC言語(PCM)を使っておりましたのでVBはまったくの素人です。 意味不明な質問になっているかもしれませんがご理解の上宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

#2氏の回答のように Writeメソッドを Byte配列で出力してみましょう dim s as String = "ABCDEあいうえお" Dim b As Byte() = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(s) SerialPort1.Write( b, 0, b.Length ) といった具合です 受信については SerialPort1.ReadLineを dim buf() AS Byte Array.Resize( buf, SerialPort1.BytestoRead ) SerialPort1.Read( buf, 0, SerialPort1.BytestoRead ) strDataReceived = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString( buf ) といった具合にして見ましょう

MIKAHA
質問者

お礼

早々の皆様のご協力に感謝です。 SerialPort1.Write( b, 0, b.Length ) このように配列を出力するのですね。助かります。 確かにコンパイルは通りました。 しかし結果はやはり文字化けです。 受け側のPCはハイパーターミナルで受信していますが 今までは「あいうえお」→「?????」のように 全角文字数分?を表示していましたが、上記Byte配列出力に変えたら , ,?,?|,・(?部分は意味部名なギリシャ文字みたいなもの) となり、やはり文字化けです。 私のやり方に問題があるのでしょうか? ちなみに英数字のほかにも*l;`p*?><|\なども記号も正常に通信します。 宜しくお願いいたします。

MIKAHA
質問者

補足

警告 1 変数 'buf1' は、値が割り当てられる前に参照によって渡されています。Null 参照の例外が実行時に発生する可能性があります。 受信に関しては上記のような注意がでましたが 正常に全角文字を受信してくれました。 ありがとうございます。

その他の回答 (3)

回答No.4

>警告 1 変数 'buf1' は、値が割り当てられる前に参照によって渡されています。Null 参照の例外が実行時に発生する可能性があります。 警告メッセージそのままですね。 値を設定する前に使用される可能性があるからです。 dim buf1() AS Byte = Nothing(No3さんのソースだとbufだけど名前が違うのかそれとも別の変数なのかな・・・) ↑のように初期化すれば警告は消えると思われます。 C#やJavaでも同様の記述をするとやはり似たような警告が出ます。

MIKAHA
質問者

お礼

ご返事を頂、有難うございます。 buf1は名前を変えただけです。 ディメンジョンのバイト定義に=Nothingを付ければ良いのですね。 やってみます。 ・・・・しかし、PCが立ち上がらない・・・ 朝電源を入れたら、OSにアクセスすらしてくれません。 もう1台のPCにはVB入ってないし・・ 今、バッテリーを外して放電をしています。治るとは?思えないけど・・ No4さんのご指摘でワーニングが消えるか試してみたい! 早くPCが生き返って欲しいです。

noname#259269
noname#259269
回答No.2

以下のコードで、Shift-JISのバイト配列に置換できますが、答えになっていますでしょうか。 Dim s As String = "ABCDEあいうえお" Dim b As Byte() = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(s)

MIKAHA
質問者

お礼

ご回答ありがとうございます。 私は、VBは本当に素人(VB歴3日)(^^;ですので自信が無いのですが・・ 下記は通信の送信部分です。 DIMでString定義をすれば良いのか?と思いやってみました。 Dim s As String = "ABCDEあいうえお" 'SerialPort1.Write("ABCDEあいうえお")←現在はこんな感じ SerialPort1.Write(s)   →ご指摘の変数宣言してみました。 SerialPort1.Write(Chr(13) & Chr(10)) 'CRLF 結果は同じでした。 ABCDE???? この?はハイパーターミナルでの表示で例外はすべて?表示のようです。 実際は意味不明な文字化けになると思います。 受信は Delegate Sub AddDataDelegate(ByVal str As String) Private Sub AddData(ByVal str As String) TextBox3.Text = TextBox3.Text + str End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim strDataReceived As String Dim add As New AddDataDelegate(AddressOf AddData) Try strDataReceived = SerialPort1.ReadLine Catch ex As Exception strDataReceived = ex.Message End Try TextBox3.Invoke(add, strDataReceived) End Sub 受信データーを受けると TextBox3.Text  に表示するようにしています。 やはりこれも文字化けします。(半角英数字は正常) 受信データーはS-JISを受信しているはずなのですが・・・ もしかして、UTF-8に変えられた?って感じです。 宜しくお願いいたします。

MIKAHA
質問者

補足

バイト配列の置き換えですが下記のようなコンパイルエラーになります。 エラー 1 型 'Byte の 1 次元配列' の値を 'String' に変換できません。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

シリアルポートは「8ビット」になっていますか? もし「7ビット」になっているなら、UTF-8だろうが、S-JISだろうが、EUCだろうが、8ビットのデータは送受信出来ず、どの文字コードでも文字化けします。 7ビットで唯一送受信可能なのは「JISコード」のみです。JISコードであれば、使用するキャラクタはすべて7ビットなので、シリアルポートが7ビットでも問題は起きません。 逆に言うと「シリアルポートを8ビットにしておけば、どんなキャラクタも通るので、文字コードは何であってもOK」なので、コード変換する必要はなくなります。 結論:送受信とも、シリアルポートを7ビットから8ビットに変更しましょう

MIKAHA
質問者

お礼

早々のご返事を頂感謝いたします。 シリアルポートは 通信速度9800bps データービット 「8bit」 パリティー なし ストップビット 1bit ケーブルは単純な送受信クロスとGRDのみの3本配線です。 送受信データーの長さは「8bit」にしております。 宜しくお願いいたします。

関連するQ&A

専門家に質問してみよう