Skip to content

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:

vb
' 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:

vb
' 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:

vb
' Use Unicode (no conversion)
m_oClient.SendData "中文测试", ScpUnicode
m_oClient.GetData sData, , , ScpUnicode

Default Encoding ​

SendData Default Encoding ​

vb
Public Sub SendData(Data As Variant, Optional ByVal CodePage As EnumScpCodePage = ScpAcp)

Default Value: ScpAcp (0) - ACP/GBK

GetData/PeekData Default Encoding ​

vb
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

vb
' 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 Sub

Advantages:

  • Internationalization support
  • Compatible with modern systems
  • Web standard encoding

🏢 Scenario 2: Traditional VB6 Applications ​

Recommendation: Use default ACP/GBK

vb
' 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 Sub

Advantages:

  • 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

vb
' 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

vb
' 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 Sub

Common Issues ​

❓ Issue 1: Chinese Garbled Text ​

Symptom: Received Chinese displays as garbled text

Cause: Different encoding used for sending and receiving

Solution:

vb
' ✅ 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:

vb
' 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:

vb
' 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:

vb
' 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:

vb
' 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 Sub

Encoding Conversion Utility Functions ​

Encoding Detection ​

vb
' 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 Function

Encoding Conversion ​

vb
' 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 Function

Best Practices ​

  1. Unified Encoding: Use same encoding for send and receive
  2. Explicit Specification: Always explicitly specify encoding parameter, don't rely on default
  3. Documentation: Record encoding used for each connection
  4. Encoding Negotiation: Negotiate encoding at protocol level
  5. Error Handling: Handle encoding conversion errors
vb
' 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 ​

  1. Mixed Encoding: Using different encodings on same connection
  2. Rely on Default: Not specifying encoding parameter, relying on default
  3. Ignore Detection: Not detecting encoding used by peer
  4. Blind Conversion: Converting without verification

Last Updated: 2026-01-09

VB6 and LOGO copyright of Microsoft Corporation