網絡通訊與數據庫存取中文亂碼是 C# 開發常見痛點。核心原則:**全鏈路統一使用 Unicode (UTF-16/UTF-8) 編碼**。本文通過 Socket 通訊與 SQL Server/MySQL 存取示例,演示正確處理姿勢。
中文字符佔 2 字節,直接用默認編碼發送會產生亂碼。正確做法:發送前 Encoding.Unicode.GetBytes(),接收後 Encoding.Unicode.GetString()。
try {
IPAddress MyIP = IPAddress.Parse("127.0.0.1");
TcpListener MyListener = new TcpListener(MyIP, 1235);
MyListener.Start();
Socket MySocket = MyListener.AcceptSocket();
byte[] MyData = new byte[256];
MySocket.Receive(MyData);
this.richTextBox1.AppendText(Encoding.Unicode.GetString(MyData));
UnicodeEncoding MyInfo = new UnicodeEncoding();
MySocket.Send(MyInfo.GetBytes("From Server:你好!我是服務器"));
} catch (Exception ex) { MessageBox.Show(ex.Message); }
try {
TcpClient MyClient = new TcpClient();
MyClient.Connect("127.0.0.1", 1235);
Stream MyStream = MyClient.GetStream();
UnicodeEncoding MyInfo = new UnicodeEncoding();
byte[] MySendByte = MyInfo.GetBytes("From Client:你好!我是客戶端");
MyStream.Write(MySendByte, 0, MySendByte.Length);
byte[] MyData = new byte[256];
MyStream.Read(MyData, 0, 256);
this.richTextBox1.AppendText(Encoding.Unicode.GetString(MyData));
} catch (Exception ex) { MessageBox.Show(ex.Message); }
SQL 腳本中字符串參數加 N 前綴聲明 Unicode,對應列類型必須為 nchar/nvarchar/ntext(n 代表 National/Unicode)。
string MySQL = string.Format(
"INSERT INTO [BSM_SystemServiceInfoTable] VALUES ({0}, N'{1}', N'{2}', N'{3}', N'{4}')",
AgentID, data[1], data[2], data[3], data[0]);
SqlCommand MyCommand = new SqlCommand(MySQL, MyConnect);
MyCommand.Connection.Open();
MyCommand.ExecuteNonQuery();
MyCommand.Connection.Close();
MySQL 不需要 N 前綴,但要求連接層指定字符集。MySqlConnector / MySql.Data 驅動均支持連接字符串參數:
MySQLConnection con = new MySQLConnection( "server=127.0.0.1;uid=root;pwd=;database=test;Charset=utf8");
或使用 Character Set=utf8mb4(推薦,支持 Emoji)。
| 環節 | 關鍵設置 |
|---|---|
| C# 字符串 | 原生 Unicode (UTF-16),無需額外處理 |
| 網絡發送/接收 | Encoding.Unicode / UTF8.GetBytes/GetString |
| MySQL 連接字符串 | Charset=utf8mb4 |
| MySQL 表/列字符集 | CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
| SQL Server 列類型 | nchar/nvarchar/ntext + 參數加 N 前綴 |
| 控制台/日誌輸出 | 終端編碼設置為 UTF-8 |
「全鏈路 Unicode」是防亂碼鐵律。C# 內部已是 Unicode,關鍵在於跨邊界(網絡、數據庫)時顯式指定編碼。MySQL 推薦 utf8mb4,SQL Server 用 N'...' + nvarchar,Socket 通訊統一 Encoding.Unicode。