none
Socket通信をする際の文字コード RRS feed

  • 質問

  • お世話になっております。

    サーバとクライアントで、日本語文字列の通信をするプログラムです。

    データ構造は、

    設備番号:int
    設備名称:String
    .....

    となっており、その中の64Byte分を日本語文字列としてByte配列に格納し
    送信しています。

    送信の為に色々、調べていくとサンプルソースでは、ほとんどの作者が
    EncodingにUnicodeを使用していました。

    私の中では普通に考えるとUtf-8のような気がするのですが
    こういう通信システムでは、定石はUnicodeなのですか?

    それとも、クライアントもサーバも作成するのであれば、こちらで合わせ
    さえすればどんな文字コードでもいいのでしょうか?

    メリット・デメリット等、ご教示頂けると助かります。

    どうぞ、よろしくおねがいします。


    2013年8月26日 5:56

回答

  • C#に限らない一般論になってしまいますが、
    TCP/IPのSocketではその仕様上、送出された全てのバイトデータがその順に正しく
    受信側に到達することが保障されています。
    また、通信されるデータ内容にはバイト数とバイトの順列という概念はありますが、
    文字列という概念は存在しないため(相手のアドレスをその名前で解決するというのはありますが)、
    中身のデータがUnicodeかUTF-8が良いかといった文字という概念が前提となる考察は
    他の前提条件で結論が異なり、有意義な議論とはならないのではないでしょうか。
    つまり設計者が「送受信時の文字列」というものを定義するわけですね。
    それを送受信する手順上で考慮すべき点があるとすれば、それは効率かもしれません。
    設計者はユーザーのために、無駄と思われる様な変換手順や計算手順などの通信コストを
    できるだけ省くべきだと考えられるのですが、いかがでしょう。
    2013年8月26日 7:50
  • 送信の為に色々、調べていくとサンプルソースでは、ほとんどの作者が
    EncodingにUnicodeを使用していました。

    私の中では普通に考えるとUtf-8のような気がするのですが
    こういう通信システムでは、定石はUnicodeなのですか?

    それとも、クライアントもサーバも作成するのであれば、こちらで合わせ
    さえすればどんな文字コードでもいいのでしょうか?

    メリット・デメリット等、ご教示頂けると助かります。

    作りたいものは何でしょうか? サンプルレベルのものを目指しているのでしょうか?

    メリット・デメリットを知りたいということは実用性を考慮しているのではありませんか? であれば、サンプルを参考にしても無意味でしょう。現実にあるシステムを参考にすべきです。HTTPであればencodingを任意に指定できるとか、SMTPであれば未指定の場合ISO-2022-JPになるとか、そういう調べ方をすべきです。

    • 回答としてマーク コーベル 2013年8月27日 4:25
    2013年8月26日 13:26
  • 送信の為に色々、調べていくとサンプルソースでは、ほとんどの作者が
    EncodingにUnicodeを使用していました。

    どのようなサンプルを見られていますか?そのサンプルの背景は何でしょうか?

    極端な話、クライアントもサーバーも作成するのであれば、どのような文字集合を用意して、どのようにそれを符号化しようとも通信することはできます。しかし、車輪の再発明のように、自分で文字集合や符号化方式を用意することはまず無駄なことでしょう。
    よって、既存のどの符号化方式を採用するのかは、開発されるシステムの要件を考慮し、決定するしかありません。

    そのためには、まずUnicodeとUTF-8について調べてみて下さい。Unicodeという言葉も、Windows上で使う場合はUTF-16 LEを暗に指す場合があります(メモ帳で保存する場合の文字コードなど)。ですから、UTF-16とUTF-8についての違いを調べられると良いと思います。このようにUnicodeは、文字集合と符号化方式が混在して語られることがあるので、その辺りも注意して下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/



    2013年8月27日 2:49
    モデレータ

すべての返信

  • C#に限らない一般論になってしまいますが、
    TCP/IPのSocketではその仕様上、送出された全てのバイトデータがその順に正しく
    受信側に到達することが保障されています。
    また、通信されるデータ内容にはバイト数とバイトの順列という概念はありますが、
    文字列という概念は存在しないため(相手のアドレスをその名前で解決するというのはありますが)、
    中身のデータがUnicodeかUTF-8が良いかといった文字という概念が前提となる考察は
    他の前提条件で結論が異なり、有意義な議論とはならないのではないでしょうか。
    つまり設計者が「送受信時の文字列」というものを定義するわけですね。
    それを送受信する手順上で考慮すべき点があるとすれば、それは効率かもしれません。
    設計者はユーザーのために、無駄と思われる様な変換手順や計算手順などの通信コストを
    できるだけ省くべきだと考えられるのですが、いかがでしょう。
    2013年8月26日 7:50
  • 送信の為に色々、調べていくとサンプルソースでは、ほとんどの作者が
    EncodingにUnicodeを使用していました。

    私の中では普通に考えるとUtf-8のような気がするのですが
    こういう通信システムでは、定石はUnicodeなのですか?

    それとも、クライアントもサーバも作成するのであれば、こちらで合わせ
    さえすればどんな文字コードでもいいのでしょうか?

    メリット・デメリット等、ご教示頂けると助かります。

    作りたいものは何でしょうか? サンプルレベルのものを目指しているのでしょうか?

    メリット・デメリットを知りたいということは実用性を考慮しているのではありませんか? であれば、サンプルを参考にしても無意味でしょう。現実にあるシステムを参考にすべきです。HTTPであればencodingを任意に指定できるとか、SMTPであれば未指定の場合ISO-2022-JPになるとか、そういう調べ方をすべきです。

    • 回答としてマーク コーベル 2013年8月27日 4:25
    2013年8月26日 13:26
  • 送信の為に色々、調べていくとサンプルソースでは、ほとんどの作者が
    EncodingにUnicodeを使用していました。

    どのようなサンプルを見られていますか?そのサンプルの背景は何でしょうか?

    極端な話、クライアントもサーバーも作成するのであれば、どのような文字集合を用意して、どのようにそれを符号化しようとも通信することはできます。しかし、車輪の再発明のように、自分で文字集合や符号化方式を用意することはまず無駄なことでしょう。
    よって、既存のどの符号化方式を採用するのかは、開発されるシステムの要件を考慮し、決定するしかありません。

    そのためには、まずUnicodeとUTF-8について調べてみて下さい。Unicodeという言葉も、Windows上で使う場合はUTF-16 LEを暗に指す場合があります(メモ帳で保存する場合の文字コードなど)。ですから、UTF-16とUTF-8についての違いを調べられると良いと思います。このようにUnicodeは、文字集合と符号化方式が混在して語られることがあるので、その辺りも注意して下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/



    2013年8月27日 2:49
    モデレータ
  • 仲澤@失業者さん
    佐祐理さん
    trapemiyaさん

    ご回答ありがとうございました!

    総括すると、『お客様要件を踏まえ、そのシステムに何が見合っているのか考察し、策定していく』

    といったところでしょうか。

    私自身、文字コードは多言語に対応するために様々な規格が生まれた

    のように解釈しておりましたがそれ自体の認識が甘かったです。

    もう一度、文字コードの基礎から勉強し、要求に対しどれが最適なのかを検証したいと思います。

    皆さんありがとうございました!

    2013年8月27日 4:25