C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: パイプ通信の文字化け対策 (C# <-> C++間)


(過去ログ 175 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■100594 / inTopicNo.1)  パイプ通信の文字化け対策 (C# <-> C++間)
  
□投稿者/ ぶなっぷ (292回)-(2022/09/29(Thu) 12:54:25)

分類:[Windows 全般] 

パイプ通信を行うアプリを作成しています。

こちら側がサーバで、C#にて作成されています。
接続先は、C++にて作成されています。

文字列をパイプにてやりとりしていて、文字化けすることに気づきました。
C#文字列(String)はUTF-8であり、C++文字列(char[])はS-JISであるためでした。
文字列のエンコード変換を行うと、文字化けが直りました。

そこで、はたと疑問にぶち当たりました。
S-JISって、日本語OSだからだよね?
うちのソフトウェアは海外にも出荷されるよね?
中国語とか、S-JIS <-> UTF-8 変換でいいの?

調べているうちに、Encoding.Default なるものを発見。
  Encoding.Default <-> Encoding.UTF8
で変換するのが良さげだけど、自信なし。

このあたりの事情、詳しい方はおられますでしょうか?
よろしくお願いいたします。

引用返信 編集キー/
■100595 / inTopicNo.2)  Re[1]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ WebSurfer (2562回)-(2022/09/29(Thu) 14:37:53)
No100594 (ぶなっぷ さん) に返信

> 調べているうちに、Encoding.Default なるものを発見。
> Encoding.Default <-> Encoding.UTF8
> で変換するのが良さげだけど、自信なし。


"On .NET Core, the Default property always returns the UTF8Encoding. UTF-8 is supported
on all the operating systems (Windows, Linux, and macOS) on which .NET Core applications
run."

・・・だそうです。

Encoding.Default Property
https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding.default?view=net-6.0
引用返信 編集キー/
■100599 / inTopicNo.3)  Re[2]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ ぶなっぷ (293回)-(2022/09/29(Thu) 14:59:56)
WebSurfer さん

ですよね、その点は私も気にしました。
ただ、当面、.Net Coreに置き換え予定はないし、
置き換えたら置き換えたで、テストやり直すだろうから、文字化けにも気づくでしょう。

.Net FrameWork前提で最善策を探ることにしました。
パイプ通信の相手側はC++にてエンコード未指定です。
C++側のエンコード指定を行う手もありますが、諸事情により、それは最終手段としたい。

では、C++にてエンコード未指定に最も近い仕様は?
  Encoding.Default
かなと思っています。

これは!と思うような方法が見つからなければ、Encoding.Default で行くことにします。

引用返信 編集キー/
■100600 / inTopicNo.4)  Re[3]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ 伝説のカレー (43回)-(2022/09/29(Thu) 15:45:37)
同じPCでC#のプログラムもC++のプログラムも動くので
両方でシステムのエンコーディングを使えば文字化けしないってことですかね

Shift_JISとUTF-8で文字化けが起こるってことは英数字以外の文字列をやりとりするってことですよね
Shift_JISで表せない文字列をやりとりしたくなったときにはシステムのエンコーディングを変えてもらう感じなんですかね
UTF-8で統一したほうがいんじゃないかなって私は思いました
引用返信 編集キー/
■100601 / inTopicNo.5)  Re[1]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ 魔界の仮面弁士 (3457回)-(2022/09/29(Thu) 16:13:45)
No100594 (ぶなっぷ さん) に返信
> C#文字列(String)はUTF-8であり、C++文字列(char[])はS-JISであるためでした。
C# 文字列そのものは UTF-16 相当で管理されていますね(というか BSTR 互換)。
https://www.buildinsider.net/language/csharpunicode/02

ただしこれは、どの Encoding で変換されるかという点とは別の話です。


> 中国語とか、S-JIS <-> UTF-8 変換でいいの?
.NET Framework の場合、System.Text.Encoding.Default は OS の既定のコードページを返すはず。

明示的に指定するのであれば、
簡体字圏(Simplified Chinese)なら GB2312(EUC_CN) … Encoding.GetEncoding(936) 相当
繁体字圏(Traditional Chinese)なら Big5 … Encoding.GetEncoding(950) 相当
日本語圏(Japanese)なら Shift_JIS … Encoding.GetEncoding(932) 相当
が使われると思います。

送信側と受信側の両方に手を入れられるなら、UTF-8 か UTF-16 で統一するのが良さそうですが、
既定のコードページが前提なら、System.Text.Encoding.Default で変換する形になるかと。
引用返信 編集キー/
■100602 / inTopicNo.6)  Re[4]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ ぶなっぷ (294回)-(2022/09/29(Thu) 16:24:35)
伝説のカレー さん
魔界の仮面弁士 さん

> 同じPCでC#のプログラムもC++のプログラムも動くので
> 両方でシステムのエンコーディングを使えば文字化けしないってことですかね
> Shift_JISとUTF-8で文字化けが起こるってことは英数字以外の文字列をやりとりするってことですよね
> Shift_JISで表せない文字列をやりとりしたくなったときにはシステムのエンコーディングを変えてもらう感じなんですかね

そんな感じです。

> UTF-8で統一したほうがいんじゃないかなって私は思いました

> 送信側と受信側の両方に手を入れられるなら、UTF-8 か UTF-16 で統一するのが良さそうですが、

私も1から設計するならそれがいいかなと思います。

すでに、パイプサーバ/クライアント側とも既存アプリ(C++)が存在します。
そして、今回、パイプサーバ側のみC#へ移行します。
既存アプリは簡単には触らせてもらえないので、C++側のエンコーディングに合わせにいきたいわけです。

> 既定のコードページが前提なら、System.Text.Encoding.Default で変換する形になるかと。
結局、これが答えですね。

今回はこれで行くことにします。

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

解決済み
引用返信 編集キー/
■100604 / inTopicNo.7)  Re[5]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ radian (96回)-(2022/09/29(Thu) 16:59:16)
Console.WriteLine(Console.InputEncoding.CodePage);
Console.WriteLine(Encoding.Default.CodePage);

を出力してみると、
(.NET Framework 4.8)
932
932

(.NET 6)
932
65001

となったので、Console.InputEncoding だと.NET Core系でも対応出来そうな感じがします(多分)

解決済み
引用返信 編集キー/
■100605 / inTopicNo.8)  Re[6]: パイプ通信の文字化け対策 (C# <-> C++間)
□投稿者/ Hongliang (1254回)-(2022/09/29(Thu) 17:52:53)
2022/09/29(Thu) 19:58:33 編集(投稿者)

Console.InputEncodingはCHCPコマンドとかで変更されうるので、信用することはできません。
.NET Core/.NET 5以降の場合、
System.Text.CodePagesEncodingProvider
を使って
GetEncoding(0)
するのがいいかと思います。
// Coreの頃はnugetから取る必要があった気がするけどいつのまにか標準に入ってるっぽい
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -