cWinsock Encoding Guide
📖 Table of Contents
Overview
cWinsock supports multiple text encoding methods to adapt to different application scenarios. Proper use of encoding is crucial for ensuring data transmission accuracy and compatibility.
Encoding Types
🇨🇳 ScpAcp (ACP/GBK)
Value: 0
Description: System default code page (ANSI Code Page)
Characteristics:
- GBK encoding on Chinese Windows
- Consistent with VB6 internal string storage
- Single-byte characters 1 byte, Chinese characters 2 bytes
- Suitable for local applications in Chinese environment
Use Cases:
- Traditional VB6 applications
- Applications with mainly Chinese characters
- Compatible with existing VB6 systems
Example:
' Default uses ACP/GBK encoding
m_oClient.SendData "中文测试"
m_oClient.GetData sData🌐 ScpUtf8 (UTF-8)
Value: 65001
Description: UTF-8 encoding
Characteristics:
- International standard, supports all Unicode characters
- Compatible with ASCII
- Single-byte characters 1 byte, Chinese characters 3 bytes
- Preferred encoding for network transmission
Use Cases:
- Web applications
- Internationalized applications
- Interacting with modern systems
- Need to support multiple languages
Example:
' Use UTF-8 encoding
m_oClient.SendData "中文测试", ScpUtf8
m_oClient.GetData sData, , , ScpUtf8🌟 ScpUnicode (Unicode)
Value: -1
Description: Unicode encoding (no conversion)
Characteristics:
- Keeps strings as wide characters (UTF-16)
- No encoding conversion
- Each character 2 bytes (most characters)
Use Cases:
- Internal data transmission
- Need to preserve original string format
- Don't want encoding conversion
Example:
' Use Unicode (no conversion)
m_oClient.SendData "中文测试", ScpUnicode
m_oClient.GetData sData, , , ScpUnicodeDefault Encoding
SendData Default Encoding
Public Sub SendData(Data As Variant, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)Default Value: ScpAcp (0) - ACP/GBK
GetData/PeekData Default Encoding
Public Sub GetData(Data As Variant, Optional ByVal VarType_ As Long, Optional ByVal MaxLen As Long = -1, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)
Public Sub PeekData(Data As Variant, Optional ByVal VarType_ As Long, Optional ByVal MaxLen As Long = -1, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)Default Value: ScpAcp (0) - ACP/GBK
Design Reason
- Consistent with traditional VB6 encoding
- Compatible with most VB6 applications
- Avoid garbled text from encoding inconsistencies
Encoding Selection Recommendations
🎯 Scenario 1: New Network Applications
Recommendation: Use UTF-8
' Send
m_oClient.SendData "Hello 世界", ScpUtf8
' Receive
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
Client.GetData sData, , , ScpUtf8
Debug.Print sData ' "Hello 世界"
End SubAdvantages:
- Internationalization support
- Compatible with modern systems
- Web standard encoding
🏢 Scenario 2: Traditional VB6 Applications
Recommendation: Use default ACP/GBK
' Send (default ACP)
m_oClient.SendData "中文测试"
' Receive (default ACP)
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
Client.GetData sData
Debug.Print sData ' "中文测试"
End SubAdvantages:
- Consistent with VB6 internal encoding
- No extra encoding settings needed
- Compatible with existing code
🌍 Scenario 3: Mixed Encoding Environment
Recommendation: Dynamically select based on peer's encoding
' Detect peer encoding before sending
Private Sub SendDataAdaptive(ByVal sText As String)
If m_oRemoteEncoding = "UTF8" Then
m_oClient.SendData sText, ScpUtf8
Else
m_oClient.SendData sText, ScpAcp
End If
End Sub
' Receive with encoding detection
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
If m_oRemoteEncoding = "UTF8" Then
Client.GetData sData, , , ScpUtf8
Else
Client.GetData sData
End If
ProcessData sData
End Sub🔧 Scenario 4: Protocol Encoding Negotiation
Recommendation: Negotiate encoding when connection established
' Send encoding negotiation after connection
Private Sub m_oClient_Connect(Client As cWinsock)
' Send supported encoding list
Client.SendData "ENCODING:SUPPORT:ACP,UTF8", ScpUtf8
End Sub
' Server response
Private Sub m_oServer_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
Client.GetData sData, , , ScpUtf8
If Left$(sData, 21) = "ENCODING:SUPPORT:" Then
' Select encoding
Dim sEncodings() As String
sEncodings = Split(Mid$(sData, 22), ",")
' Prefer UTF-8
Dim sSelected As String
If InStr("UTF8", sEncodings(0)) > 0 Then
sSelected = "UTF8"
Else
sSelected = "ACP"
End If
' Respond with selected encoding
Client.SendData "ENCODING:SELECT:" & sSelected, ScpUtf8
' Save client's encoding
Client.UserData = sSelected
End If
End SubCommon Issues
❓ Issue 1: Chinese Garbled Text
Symptom: Received Chinese displays as garbled text
Cause: Different encoding used for sending and receiving
Solution:
' ✅ Correct: Use same encoding for send and receive
m_oClient.SendData "中文测试", ScpUtf8
' When receiving
Client.GetData sData, , , ScpUtf8
' ❌ Wrong: Inconsistent encoding
m_oClient.SendData "中文测试", ScpUtf8 ' Use UTF-8
' When receiving
Client.GetData sData ' Use default ACP → garbled❓ Issue 2: UTF-8 Byte Length Error
Symptom: Byte count doesn't match expectation
Cause: UTF-8 is variable-length encoding, Chinese characters occupy 3 bytes
Solution:
' Calculate actual byte count
Function GetByteCount(ByVal sText As String, ByVal eCodePage As EnumScpCodePage) As Long
Dim oSocket As New cAsyncSocket
Dim baData() As Byte
baData = oSocket.ToTextArray(sText, eCodePage)
GetByteCount = UBound(baData) + 1
End Function
' Use
Dim lLen As Long
lLen = GetByteCount("中文测试", ScpUtf8)
Debug.Print lLen ' 12 (each Chinese character 3 bytes)❓ Issue 3: Communicating with Web Server
Symptom: Web server returned content displays incorrectly
Cause: Web server usually uses UTF-8, but client used default encoding
Solution:
' Send HTTP request (use UTF-8)
m_oClient.SendData "GET / HTTP/1.1" & vbCrLf & "Host: example.com" & vbCrLf & vbCrLf, ScpUtf8
' Receive response (use UTF-8)
Private Sub m_oClient_DataArrival(Client As cWinsock, ByVal bytesTotal As Long)
Dim sData As String
Client.GetData sData, , , ScpUtf8
' Parse response
Debug.Print sData
End Sub❓ Issue 4: Database Encoding Conflict
Symptom: Strings read from database display abnormally after network transmission
Cause: Database encoding inconsistent with network transmission encoding
Solution:
' Read from database (assume database uses UTF-8)
Dim sData As String
sData = GetFromDatabase()
' Send directly (database already UTF-8)
' No conversion needed
m_oClient.SendData sData, ScpUtf8
' Or convert to ACP before sending
Dim baUtf8() As Byte
Dim sAcp As String
' First convert to UTF-8 byte array
baUtf8 = ConvertToUtf8Bytes(sData)
' Then convert to ACP string
sAcp = ConvertFromUtf8Bytes(baUtf8)
m_oClient.SendData sAcp❓ Issue 5: File Transfer Encoding
Symptom: Content garbled after transferring text file
Cause: File encoding inconsistent with network transmission encoding
Solution:
' Read text file
Private Function ReadFile(ByVal sFilePath As String, ByVal eCodePage As EnumScpCodePage) As String
Dim iFileNum As Integer
iFileNum = FreeFile
Open sFilePath For Binary As #iFileNum
Dim baData() As Byte
ReDim baData(0 To LOF(iFileNum) - 1) As Byte
Get #iFileNum, , baData
Close #iFileNum
Dim oSocket As New cAsyncSocket
ReadFile = oSocket.FromTextArray(baData, eCodePage)
End Function
' Send file
Private Sub SendFile(ByVal sFilePath As String)
Dim sContent As String
' Assume file is UTF-8 encoded
sContent = ReadFile(sFilePath, ScpUtf8)
' Send using UTF-8
m_oClient.SendData sContent, ScpUtf8
End SubEncoding Conversion Utility Functions
Encoding Detection
' Simple UTF-8 detection
Function IsLikelyUtf8(ByVal sText As String) As Boolean
' Check for high-byte characters
Dim i As Long
For i = 1 To Len(sText)
If AscW(Mid$(sText, i, 1)) > 255 Then
IsLikelyUtf8 = True
Exit Function
End If
Next
IsLikelyUtf8 = False
End FunctionEncoding Conversion
' ACP to UTF-8 conversion
Function AcpToUtf8(ByVal sText As String) As String
Dim oSocket As New cAsyncSocket
Dim baAcp() As Byte
Dim baUtf8() As Byte
' ACP → Byte array
baAcp = oSocket.ToTextArray(sText, ScpAcp)
' Byte array → UTF-8 string (needs extra handling)
' VB6 needs to use Win32 API for conversion
' Simplified demonstration here
AcpToUtf8 = sText ' Actual implementation needs to call MultiByteToWideChar
End FunctionBest Practices
✅ Recommended Practices
- Unified Encoding: Use same encoding for send and receive
- Explicit Specification: Always explicitly specify encoding parameter, don't rely on default
- Documentation: Record encoding used for each connection
- Encoding Negotiation: Negotiate encoding at protocol level
- Error Handling: Handle encoding conversion errors
' Example: Network class wrapper
Public Sub SendText(ByVal oSocket As cWinsock, ByVal sText As String)
On Error GoTo EH
' Use configured encoding
Select Case m_eEncoding
Case eEncoding.UTF8
oSocket.SendData sText, ScpUtf8
Case eEncoding.ACP
oSocket.SendData sText, ScpAcp
Case eEncoding.Unicode
oSocket.SendData sText, ScpUnicode
End Select
Exit Sub
EH:
Debug.Print "Send data failed: " & Err.Description
End Sub❌ Avoid
- Mixed Encoding: Using different encodings on same connection
- Rely on Default: Not specifying encoding parameter, relying on default
- Ignore Detection: Not detecting encoding used by peer
- Blind Conversion: Converting without verification
Last Updated: 2026-01-09